【问题标题】:Segfault in my Linked List implementation我的链表实现中的段错误
【发布时间】:2012-10-19 09:03:27
【问题描述】:

这是我的代码:

#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(现在是指针)。

我做错了什么?

【问题讨论】:

  • 附带说明,您没有初始化 next 节点的 next 元素(在分配它之后)。将其设置为 NULL 以知道它是列表的最后一个元素(因为您的推送功能将元素推送到列表顶部)

标签: c segmentation-fault


【解决方案1】:

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

【讨论】:

    【解决方案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: %d\n", top->data);
    
        push(&top, 2);
        printf("Pushed 2 to top, top->next->data = %d\n", top->next->data);
    }
    

    这是相关的C-FAQ

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      相关资源
      最近更新 更多