c编程链表编译但segfaults

Posted

技术标签:

【中文标题】c编程链表编译但segfaults【英文标题】:c programming linked list compiles but segfaults 【发布时间】:2022-01-02 07:46:06 【问题描述】:

代码可以在这里找到https://pastebin.com/DuxzjSsr

我用 gcc -g 编译并在 gdb 中运行,它说段错误发生在

while(current != NULL)
   current = current->next

我不明白为什么,我从这个链接https://www.learn-c.org/en/Linked_lists 复制了代码以打印出一个链接列表等,据我所知,代码几乎相同。

【问题讨论】:

您确定current->next 总是初始化为NULL 或有效的内存地址吗? 请不要将代码发布为外部链接,否则可能无法访问。将其作为格式化文本复制到问题中。 【参考方案1】:

首先你初始化列表的头部错误。除了数据成员之外,您还应该初始化下一个指针,这样它就不会指向某个垃圾值。当您的打印函数读取该指针(或任何其他函数)时,它将崩溃。

将此添加到您的主目录

mylist.next = NULL;

你的数据的插入也有同样的错误(34-35行)

current->next = (clist *)malloc(sizeof(clist));
current->next->data = strtoadd;

这一行将完成数据插入的技巧

current->next->data->next = NULL;

【讨论】:

【参考方案2】:

在您的代码中,您从未正确初始化 next。因此,该值很可能是内存中剩余的“垃圾”数据。在这里,您创建一个 clist 变量并仅设置 data 属性:

  clist mylist;
  mylist.data = "First string";

问题是您不执行mylist.next = NULL;,因此该位置发生的任何事情仍然存在,并且您的代码将尝试在您的列表迭代current = current->next 中将该值分配给current。这可能会导致段错误。您正在尝试访问任意位置的内存,结果是未定义的行为。根据经验,始终初始化指针或将其值分配给 NULL

【讨论】:

以上是关于c编程链表编译但segfaults的主要内容,如果未能解决你的问题,请参考以下文章

C Windows中的简单链表

编程经验关于链表还有编译器

26.C++- 泛型编程之类模板(详解)

26.C++- 泛型编程之类模板(详解)

C语言链表问题,作业编程。编好出现问题。高手看下。

C语言写的链表。明明没有错误,为啥编译器还会报错,?而且还爆出100+的错误,求解。