我的链接列表实现中的Segfault

时间:2012-10-19 09:03:28

标签: c segmentation-fault

这是我的代码:

#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);
}

程序在最后一行(push(top, 2);)发生段错误,我想在行top = new_node;

我只是在学习C(现在指针)。

我做错了什么?

2 个答案:

答案 0 :(得分:5)

这里的问题是您将指针传递给top元素的值,然后您尝试在函数内部设置指针但是它只是一个局部变量并且对它的更改将不可见功能之外。

通过引用传递top指针,使用指向指针的指针:

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);

另一种方法是从函数中返回新的顶部:

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);

答案 1 :(得分:1)

指针按值传递给push。因此,您对top所做的更改未反映在main中。如果要更改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