2012-02-21 2 views
1

노드 *가 포함 된 노드 구조체를 정의하려고했습니다. 이전 노드 옆에 새 노드를 추가하는 append(node* n) 함수를 작성하지만 코드를 실행할 때마다 seg fault가 발생합니다. 내 코드는 다음과 같습니다.포인터 malloc 실패

#include<stdlib.h> 
#include<stdio.h> 


typedef struct _log_t { 
    struct _log_t* next; 
}log_t; 

void initi(log_t* l) { 
    l = (log_t*)malloc(sizeof(log_t)); 
    l -> next = NULL; 
} 

void append(log_t* l){ 
    l->next = (log_t*)malloc(sizeof(log_t)); 
    l->next->next = NULL; 
    l = l->next; 
} 

미리 도움 주셔서 감사합니다!

답변

6
l = l->next; 

그 라인은 당신이 생각하는대로하지 않습니다. 사실, 아무 것도하지 않습니다.

아마도 log_t *를 log_t**으로 전달하거나 새로운 log_t*을 반환하고 싶을 것입니다.

+0

절대적으로 올바른 : – paulsm4

-2

초기화하지 않은 포인터를 참조하지 마십시오.

log_t * append (log_t* l) { 
    // Initialize the head 
    if (l == NULL) { 
    l = (log_t *)malloc(sizeof (log_t)); 
    l->next = NULL; 
    } 
    // Initialize a sub-node 
    else { 
    l->next = (log_t *)malloc(sizeof (log_t)); 
    l->next->next = NULL; 
    } 
    // Always return the head 
    return l; 
} 
+0

안녕하세요 그냥 완벽하게 잘 ... initalization을하고있다 : 그것은 :)

// OK (but you should check for malloc() failing, too!) void initi(log_t* l) { l = (log_t*)malloc(sizeof(log_t)); l -> next = NULL; } void append(log_t* l){ // OK... l->next = (log_t*)malloc(sizeof(log_t)); // BAD!!!! l->next: allocated. l->next->next: *NOT* initialized! l->next->next = NULL; l = l->next; } 

충돌 왜 그게 여기 가능성이 평균 당신 생각 무엇입니다. 역 참조가 없습니다. –

+0

그 업데이트가 더 나쁘다 .. append (NULL) .. 그게 의미가 없다. –

+0

@yi_H : 요점은 당신이 "l"을 할당하고, 2) "l-> next"를 초기화 할 때까지 "l-> next-> next"를 역 참조 할 수 없다는 것입니다. l-> next를 NULL 또는 새로 할당 된 값으로 초기화하는 것이 이상적입니다. 그것은 * 사용하지 * 확인 * 그것을하기 전에 * 그것을 초기화했습니다. – paulsm4