链表的分段错误 - 仅在使用多个时

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 中,您永远不会初始化head1head2。我建议您阅读以下内容:***.com/questions/766893/… 【参考方案1】:

如果头节点不存在,您的 insert() 函数会创建头节点。当您将 NULL 指针作为第一个参数传递给 insert() 时,就会发生这种情况。在您的主函数中,head1 和 head2 指针都是自动变量,因此在您第一次调用 insert() 时它们将是未定义的。您应该将他们的声明更改为:

LL *head1 = NULL;
LL *head2 = NULL;

【讨论】:

哦,我的上帝...完全被忽视了几个小时。非常感谢,现在可以使用了!该死的我恨自己 @MithranKesavan 这是编程的陷阱之一,长时间盯着你的代码,却看不到明显的东西。不要对自己太苛刻 :) 欢迎来到 ***! PS。不要忘记将其设置为接受的答案。谢谢。 感谢您的客气话,刚刚将其标记为已接受的答案!我真的很尊重你的友好和热情的态度,祝你一路好运

以上是关于链表的分段错误 - 仅在使用多个时的主要内容,如果未能解决你的问题,请参考以下文章

C ++中链表实现中的分段错误

[仅在多个节点上的MPI分段故障

为啥我的代码中出现分段错误(核心转储)错误?

分段错误仅在发布配置下发生

C快速排序(链表)分段错误

链表中的分段错误