链表的分段错误 - 仅在使用多个时
Posted
技术标签:
【中文标题】链表的分段错误 - 仅在使用多个时【英文标题】:Segmentation Fault with Linked List - only when using more than one 【发布时间】:2022-01-07 04:02:09 【问题描述】:所以我编写了一个函数来将元素插入到链表的末尾,它按预期工作。或者我一直在想,直到我尝试对另一个列表使用相同的函数,这会产生分段错误,我不知道为什么。如果这不是最好的插入方式,请见谅,我还在学习中。
实施:
struct Node
int data;
struct Node* next;
;
typedef struct Node LL;
LL *makeNode(int data)
LL *res = malloc(sizeof(LL));
res->data = data;
res->next = NULL;
return res;
LL *insert(LL *head, int item)
if(!head)
return makeNode(item);
else if(!head->next)
head->next = makeNode(item);
else
LL *tmp = head;
while(tmp->next)
tmp = tmp->next;
tmp->next = makeNode(item);
return head;
void display(LL *head)
if(!head)
printf("\n");
return;
printf("%d, ", head->data);
display(head->next);
这是我在主函数中的调用方式:
int main()
srand(time(0));
LL *head1, *head2;
int i, n1 = 10, n2 = 10, item;
for(i=0; i<n1; i++)
item = rand()%10;
head1 = insert(head1, rand()%10);
for(i=0; i<n2; i++)
item = rand()%10;
head2 = insert(head2, rand()%10);
display(head1);
printf("2: ");
display(head2);
当我单独使用 LL head1 或 LL head2 进行测试时,上面的代码提供了预期的输出。但是同时做这两个会导致臭名昭著的分段错误,我不确定为什么。任何帮助将不胜感激,在此先感谢。
【问题讨论】:
在main
中,您永远不会初始化head1
和head2
。我建议您阅读以下内容:***.com/questions/766893/…
【参考方案1】:
如果头节点不存在,您的 insert()
函数会创建头节点。当您将 NULL 指针作为第一个参数传递给 insert() 时,就会发生这种情况。在您的主函数中,head1 和 head2 指针都是自动变量,因此在您第一次调用 insert() 时它们将是未定义的。您应该将他们的声明更改为:
LL *head1 = NULL;
LL *head2 = NULL;
【讨论】:
哦,我的上帝...完全被忽视了几个小时。非常感谢,现在可以使用了!该死的我恨自己 @MithranKesavan 这是编程的陷阱之一,长时间盯着你的代码,却看不到明显的东西。不要对自己太苛刻 :) 欢迎来到 ***! PS。不要忘记将其设置为接受的答案。谢谢。 感谢您的客气话,刚刚将其标记为已接受的答案!我真的很尊重你的友好和热情的态度,祝你一路好运以上是关于链表的分段错误 - 仅在使用多个时的主要内容,如果未能解决你的问题,请参考以下文章