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的主要内容,如果未能解决你的问题,请参考以下文章