2015-01-23 3 views
0

이 코드를 실행할 때 printf 문이 작동하지 않는 이유를 알 수 없습니다.포인터로 포인터를 사용하여 Realloc 동작

typedef struct list { 
    int n; 
    struct list *next; 
}List; 

List **head; 


List *tmp=malloc(sizeof(List)); 
tmp->n=34; 
tmp->next=NULL; 
List *tmp2=malloc(sizeof(List)); 
tmp2->n=45; 
tmp2->next=NULL; 
List *tmp3=malloc(sizeof(List)); 
tmp3->n=26; 
tmp3->next=NULL; 


head=malloc(sizeof(head)); 
head[0]=tmp; 
head[1]=tmp2; 
head=realloc(head,sizeof(head)); 
head[2]=tmp3; 
printf("n of tmp:%d \n",head[0][0].n); 
printf("n of tmp2:%d \n",head[1][0].n); 
printf("n of tmp3:%d \n",head[2][0].n); 
나는 그 이유는 아마 realloc이라고 생각

, 그런데 왜 : 여기 코드인가? 나는 제대로 사용하고있다, 안 그래? 나는 당신은 단지 하나의 포인터를위한 공간을 할당이 튜토리얼을 http://www.tutorialspoint.com/c_standard_library/c_function_realloc.htm

답변

-1

의 결과 귀하의 코드가 상대적으로 고장을 확인합니다. 다음은 이것에 대해가는 상당히 온건 한 방법 :

typedef struct list { 
    int n; 
    struct list *next; 
} List; 

int main() { 
    List *tmp1 = malloc(sizeof(List)); 
    tmp1->n = 34; 
    tmp1->next = NULL; 

    List *tmp2 = malloc(sizeof(List)); 
    tmp2->n = 45; 
    tmp2->next = NULL; 

    List *tmp3 = malloc(sizeof(List)); 
    tmp3->n = 26; 
    tmp3->next = NULL; 

    List **head = malloc(2 * sizeof(List *)); 
    head[0] = tmp1; 
    head[1] = tmp2; 
    head = realloc(head, 3 * sizeof(List *)); 
    head[2] = tmp3; 

    printf("n of tmp1: %d\n", head[0]->n); 
    printf("n of tmp2: %d\n", head[1]->n); 
    printf("n of tmp3: %d\n", head[2]->n); 
} 

나는 이것을 포함하지 않은,하지만 당신은 또한 malloc()하고 realloc() null이 아닌 포인터를 반환하는지 확인해야합니다.

2
여기뿐만 아니라 realloc

,

head = malloc(sizeof(head)); 

을 따라 한 후

head[0]=tmp; 
head[1]=tmp2; 

당신은 2

하는 경우를 저장하려고 2 포인터를위한 공간이 필요하다면 올바른 방법은

입니다.
head = malloc(2 * sizeof(*head)); 
    /*     ^always dereference when using sizeof */ 
    /* in this case it's not a problem, but in other cases it will be */ 

는 당신이 만약에 realloc() 반환 NULL, 당신은 지금 당신이 할 수는 head 포인터를 덮어을 벌써 ', 그래서

head = malloc(2 * sizeof(*head)); 
if (head == NULL) 
    doSomething_But_DontDereference_head_mayBe_exit(); 
head[0] = tmp; 
head[0] = tmp2; 

이제 realloc()malloc()의 반환 값을 확인 후, 두 요소를 채울 수 있습니다 다른 어떤 일도하지 않으려면

void *pointer; 

pointer = realloc(head, 3 * sizeof(*head)); 
if (pointer == NULL) 
    doSomethingAndProbablyFree_head_and_abort(); 
head = pointer; 

이 훨씬 안전합니다.

또한 포인터 sizeof(*head)의 크기에 저장할 포인터의 수를 곱해야합니다.

는 항상 malloc()