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处崩溃代码>所以这个解决方案实际上不起作用。