C-我链接的列表实现中的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: %dn", top->data);
    push(top, 2);
    printf("Pushed 2 to top, top->next->data = %dn", top->next->data);
}

第三行(push(top, 2);)的程序segfaults,我认为在线top = new_node;

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

我做错了什么?

这里的问题是您将指针传递给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);

指针按值通过值传递给 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: %dn", top->data);
    push(&top, 2);
    printf("Pushed 2 to top, top->next->data = %dn", top->next->data);
}

这是相关的C-FAQ。

最新更新