2013-08-17 2 views
1

나는 학습을 위해서 간단한 링크리스트의 구현을 쓰고 있어요 반복합니다. 내 연결된 목록은 값과 다음 노드에 대한 포인터를 포함하는 node 구조로 구성됩니다. 코드를 실행하면 NULL 포인터에 도달 할 때 종료해야하더라도 코드가 끝없이 반복됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?링크 된 목록은 끝없이

#include <stdio.h> 

struct node { 
    int value; 
    struct node *next_node; 
}; 

struct node * add_node(struct node *parent, int value) 
{ 
    struct node child; 
    child.value = value; 
    child.next_node = NULL; 

    parent->next_node = &child; 
    return parent->next_node; 
} 

void print_all(struct node *root) 
{ 
    struct node *current = root; 

    while (current != NULL) { 
    printf("%d\n", current->value); 
    sleep(1); 
    current = current->next_node; 
    } 
} 


int main() 
{ 
    struct node root; 
    root.value = 3; 

    struct node *one; 
    one = add_node(&root, 5); 
    print_all(&root); 
} 
+0

디버거에서 얼마나 걸음 밟았습니까? – kfsone

답변

5

여러분의 프로그램은 정의되지 않은 동작을 보여줍니다 : child 이후

struct node child; 
child.value = value; 
child.next_node = NULL; 

parent->next_node = &child; 
return parent->next_node; 

가 스택에이 정의되지 않은 동작에 이르게에 부모가 가리키는 반환 : 당신이 여기에 로컬로 할당 struct에 대한 포인터를 설정한다.

당신은 그것을 작동하도록 동적으로 child를 할당해야합니다

struct node *pchild = malloc(sizeof(struct node)); 
// In production code you check malloc result here... 
pchild->value = value; 
pchild->next_node = NULL; 

parent->next_node = pchild; 
return parent->next_node; 

을 이제 동적으로 메모리를 할당 한 것으로, 메모리를 방지하기 위해 연결리스트의 동적으로 할당 된 각 노드에 free를 호출하는 것을 잊지 마세요 누출.

+0

마지막 문장을 더 자세히 설명해 주시겠습니까? 또한'main()'함수에서'struct node root'를 선언 할 때,'root'가 지역적으로 할당되었거나'main()'함수 밖에서 접근 할 수 있습니까? – fbonetti

+0

@fbonetti'main'이 스택의 마지막 함수이기 때문에 사실상 어떤 상황에서도 선언 한 것을 사용할 수 있습니다. 'free' 함수는'malloc'으로 할당 한 모든 포인터에서 호출되어야합니다. 리스트를 통과하는'print_all'와 비슷한'free_all' 함수를 작성하고,보고있는 각 노드를 해제해야합니다. 'main'에 할당 된 노드를 해제하는 것은 불법이므로'free_all (root.next)'를 호출하고 싶을 것입니다. – dasblinkenlight

4

add_node 즉시 범위를 벗어나 다른 기능에 의해 재사용 될 수있는 로컬 변수에 대한 포인터를 리턴한다. print_all에서이 값에 액세스하면 정의되지 않은 동작이 발생합니다. 귀하의 경우 주소가 current 포인터에 의해 다시 사용되고 root->next_noderoot을 가리키는 것으로 보입니다. 이 동적으로 메모리를 할당하기 때문에

는이 문제를 해결하려면, 당신은 당신이 나중에 free를 호출해야합니다, add_node

struct node * add_node(struct node *parent, int value) 
{ 
    struct node* child = malloc(sizeof(*child)); 
    if (child == NULL) { 
     return NULL; 
    } 
    child->value = value; 
    child->next_node = NULL; 

    parent->next_node = child; 
    return child; 
} 

에 새 노드에 대한 메모리를 할당해야합니다. malloc을 사용하여 할당되도록 변경하지 않는 한 root을 무료로 시도하지 마십시오.

관련 문제