Can';我不明白为什么我的代码总是出现分段错误

Can';我不明白为什么我的代码总是出现分段错误,c,linked-list,C,Linked List,一个非常简单的代码: typedef struct node { int x; struct node* next; } *Node; void advance_node(Node ptr) { ptr = ptr->next; while (ptr) { printf("%d\n", ptr->x); ptr = ptr->next; } } int main() { Node node1 =

一个非常简单的代码:

typedef struct node {
    int x;
    struct node* next;
} *Node;

void advance_node(Node ptr) {
    ptr = ptr->next;
    while (ptr) {
        printf("%d\n", ptr->x);
        ptr = ptr->next;
    }
}

int main() {
    Node node1 = malloc(sizeof (*node1));
    Node node2 = malloc(sizeof (*node2));
    Node node3 = malloc(sizeof (*node3));

    node1->x = 1;
    node1->next = node2;

    node2->x = 4;
    node2->next = node3;

    node3->x = 9;
    node3->next = NULL;

    advance_node(node1);
    return 0;
}

我希望看到4和9的输出,但我一直得到分割错误。我的错在哪里?这简直让我发疯。

您可能因为
NULL
指针而出现seg故障

您可以在
advance\u节点
功能中轻松防范此问题,如下所示:

void advance_node(Node ptr) {
    if(!ptr) return; //protect against NULL pointer
    ptr = ptr->next;
    while (ptr) {
        printf("%d\n", ptr->x);
        ptr = ptr->next;
    }
}

我做了这个更改并在这里测试了您的代码:

尝试将您的结构声明为

typedef struct node {
    int x;
    struct node* next;
} Node;

然后使用
Node*node1=malloc(sizeof(*node1))

在读取
ptr
后,同时检查
while(ptr)
将导致空列表出现问题。我假设列表不是空的。即使在
-pedantic-Wall-Wextra
中,我也没有编译错误/警告,执行时也没有问题,但我不喜欢
节点node1=malloc(sizeof(*node1))
非常令人惊讶的是,这是允许的(node1已经存在了?),你能检查一下这三个节点的执行情况吗?我讨厌这些typedef隐藏指针…似乎工作得很好:-你有没有尝试过用调试器单步检查代码,看看segfault发生在哪里(以及当时指针中有什么值)?为什么
node1
应该为空?即使是这样,程序也会在
node1->x=1处崩溃所以这个解决方案实际上不起作用。