2012-10-19 4 views
1

여기 내 코드입니다 : 3 마지막 줄 (push(top, 2);)에서는 segfault는

#include <stdio.h> 

typedef struct node_struct { 
    int data; 
    struct node_struct *next; 
} node; 

void push(node *top, int data) { 
    node *new_node = (node*) malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->next = top; 
    top = new_node; 
} 

int main() { 
    node *top = (node*) malloc(sizeof(node)); 
    top->data = 1; 
    printf("Set data of top node to: %d\n", top->data); 

    push(top, 2); 
    printf("Pushed 2 to top, top->next->data = %d\n", top->next->data); 
} 

프로그램 세그먼테이션 폴트 (segfault)와 난 그냥 C (포인터를 배우고 top = new_node;

라인에 생각 지금).

내가 뭘 잘못 했니?

+0

참고로, 'top'노드의'next' 요소를 (할당 한 후) 초기화하지 않았습니다. 푸시 기능이 목록의 맨 위에 요소를 푸시 했으므로 'NULL'로 설정하여 목록의 마지막 요소임을 확인하십시오. – Zoneur

답변

5

여기서 문제는 top 요소 값으로 포인터를 전달한 다음 함수 내부에서 포인터를 설정하려고 시도하지만 거기에는 로컬 변수 일 뿐이며 변경 사항은 외부 변수에 표시되지 않습니다. 기능.

포인터에 대한 포인터를 이용하여, 대신에 참조로 top 포인터를 전달 :

node *push(node *top, int data) { 
    node *new_node = malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->next = top; 
    return new_node; 
} 

... 

top = push(top, 2); 
+0

아, 고마워요! – user1527166

1

: 대안 대신 함수로부터 새로운 가기를 반환한다


void push(node **top, int data) { 
    node *new_node = malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->next = *top; 
    *top = new_node; 
} 

... 

push(&top, 2); 
포인터는 값으로 push으로 전달됩니다. 따라서 변경 한 topmain에 반영되지 않습니다. 당신이 top을 변경하려면 다음 포인터의 주소를 전달합니다
#include <stdio.h> 

typedef struct node_struct { 
    int data; 
    struct node_struct *next; 
} node; 

void push(node **top, int data) { 
    node *new_node = (node*) malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->next = *top; 
    *top = new_node; 
} 

int main() { 
    node *top = (node*) malloc(sizeof(node)); 
    top->data = 1; 
    printf("Set data of top node to: %d\n", top->data); 

    push(&top, 2); 
    printf("Pushed 2 to top, top->next->data = %d\n", top->next->data); 
} 

다음은 관련 C-FAQ입니다.