2013-09-24 3 views
1

C에서 데이터베이스에 대한 포인터를 구조체하기 :복사가 나는 다음과 같은 구조가 생성 한

typedef struct { 
    char name[15]; 
    int ID; 
} Employee; 

typedef Employee Item; 

typedef struct { 
    Item items[5]; 
    int size; 
} List; 

나는이 목록에 저장되는 것을 확인하기 위해 슬쩍이 함수 호출을 사용하고 있습니다 :

void Peek (int position, List *L, Item *X); 

이 함수는 [position]의 [L] 목록에서 항목을 가져 와서 주소를 [X]로 복사해야합니다. 나는 들여다 기능이 위해 가지고 : 그러나 내가 다시 항목 X의 ID를 호출하려고하면이 중요한 것은 더 많은 메모리 누수가 발생하고 것이라고 생각 B로

void Peek (int position, List *L, Item *X) { 
    Item *B; 
    B = malloc(sizeof(L->items[position])); 
    X = B; 
} 

이 같은 위치에 X를 할당 내 main, from this function :

int EmployeeID (Employee X) { 
    return(X.ID); 
} 

32665 또는 그 라인을 따라 되돌아 왔습니다. L에서 X로 데이터를 가져 오는 또 다른 방법은 무엇입니까?

+1

모든 경고를 활성화하십시오와의 정보를 디버깅하여 컴파일러 (예 :'gcc -Wall -g' 리눅스에서); 디버거 (예 :'gdb') 사용법을 배웁니다. –

+0

디버거를 사용하면 논리 문제인지 여부를 알 수 있습니까? – user2225940

+0

예, 디버거 사용 방법을 습득해야합니다. –

답변

1

X 및 B는 두 포인터

X = B이다 포인터 할당 X 값 파라미터에 의해 패스가

없는 구조 할당 함수 내부에서 X에 값을 할당하는 값에 제로 영향을 함수 밖의 X

void Peek (int position, List *L, Item **X) 
{ 
    Item *B; 
    B = malloc(sizeof(L->items[position])); 
    *X = B; 
} 

그러나, L-> 항목 [위치]의 값이 여전히 X 공간에 지정되지 :

이 (안 해결하지만, 오른쪽 방향으로 단계)을보십시오.

옵션 2 :

void Peek(int position, List *L, Item *X) 
{ 
    *X = L->items[position]; 
} 

이 X가 이미 메모리의 malloc이 블록을 가리키는 것으로 가정합니다.

void Peek (int position, List *L, Item **X) 
{ 
    Item *B; 
    B = malloc(sizeof(L->items[position])); 
    *X = B; 
    *B = L->items[position]; 
} 
1

이 코드이 ~> 문제 "기능은 ... X에 해당 주소를 복사해야":

void Peek (int position, List *L, Item *X) { 
    Item *B = malloc(sizeof(L->items[position])); 
    X = B; 
} 

는 옵션 3 3

옵션, 그렇지 않은 경우 세 번째 인수로 전달 된 원래 포인터를 변경하지 않습니다. 당신이 실제로해야 할 것은 그래서 당신은 포인터, 즉 포인터를 함수에서이 포인터를 반환하거나 Item**로 전달하거나 필요, 포인터 자체를 수정하는 것입니다 :

void Peek (int position, List *L, Item **X) { 
    Item *B = malloc(sizeof(L->items[position])); 
    *X = B; 
} 
... 
// and somewhere: 
Peek(position, L, &X);    // <-- you should pass an address of pointer