代码可以在这里找到https://pastebin.com/DuxzjSsr
我用gcc-g编译并在gdb中运行,它说segfault发生在
while(current != NULL){
current = current->next
}
我不明白为什么,我从这个链接复制了代码https://www.learn-c.org/en/Linked_lists用于打印出链接列表等,并且据我所知,代码几乎相同。
在您的代码中,您永远不会正确初始化next
。因此,该值很可能是";垃圾";内存中剩余的数据。在这里创建一个clist
变量,并且仅设置data
属性:
clist mylist;
mylist.data = "First string";
问题是您不执行mylist.next = NULL;
,所以发生在该位置的任何内容都仍然存在,并且您的代码将尝试在列表迭代current = current->next
中将该值分配给current
。这可能会导致segfault。您试图访问任意位置的内存,结果是未定义的行为。根据经验,始终初始化指针或将其值分配给NULL
。
首先,初始化列表的头是错误的。除了数据成员,还应该初始化下一个指针,这样它就不会指向某个垃圾值。当您的打印函数读取该指针(或任何其他函数(时,它将崩溃。
将此添加到您的主
mylist.next = NULL;
此外,插入您的数据也有相同的错误(第34-35行(
current->next = (clist *)malloc(sizeof(clist));
current->next->data = strtoadd;
这条线将完成数据插入的技巧
current->next->data->next = NULL;