C 为什么我的代码出现分段错误?
我试图通过遍历列表来创建下一个节点,从而将一个项目添加到链接列表中。以及列表中指向新创建节点的最后一个节点。但我得到了一个核心转储分割错误C 为什么我的代码出现分段错误?,c,linked-list,C,Linked List,我试图通过遍历列表来创建下一个节点,从而将一个项目添加到链接列表中。以及列表中指向新创建节点的最后一个节点。但我得到了一个核心转储分割错误 void linked_list_add(list_node_t *head, void *item) { list_node_t *temp = head; while(temp->next != NULL) { temp = temp->next; } list_node_t *new
void linked_list_add(list_node_t *head, void *item)
{
list_node_t *temp = head;
while(temp->next != NULL)
{
temp = temp->next;
}
list_node_t *new_node = (list_node_t *)malloc(sizeof(list_node_t));
new_node->data = item;
new_node->next = NULL;
new_node->prev = temp;
//if(temp != NULL)
// temp->next = new_node;
// new_node->prev = temp;
}
TEST_F(LinkedList, Add)
{
int i = 3;
linked_list_add(list, &i);
ASSERT_EQ(list->next->data, &i);
i = 4;
linked_list_add(list, &i);
ASSERT_EQ(list->prev->data, &i);
i = 5;
linked_list_add(list, &i);
ASSERT_EQ(list->next->data, &i);
}
这是对评论的总结 编写的代码可能至少有3个问题:
void linked\u list\u add(list\u node\u t*head,void*item)
被传递给参数时,您通常希望能够处理head
的NULL
指针。看起来while循环立即开始搜索列表的结尾,即使头
为空new_node
将更新prev
指针,以便向后搜索不会出错。但是,不会保留前向搜索。我的意思是,链表中最后一个非NULL
节点没有指向new\u节点的next
指针
ASSERT\u EQ(list->prev->data,&i)
可能正在访问随机内存位置或NULL
指针。鉴于OP没有发布列表
结构的声明,很难说默认值是/将是什么。但是,除非此列表是循环的,list->prev
的值是未初始化的指针。根据您的设置(例如,如果链表中有设置代码将指针设置为null,则您也可以访问那里的null
指针)我希望这有助于OP解决他们的编码问题。temp是否可以为空?如果您搜索环境的调试,您可以获得堆栈跟踪,并查看发生时的情况。从现在的代码格式来看,您似乎需要取消注释(仅限)行
temp->next=new\u node;
将保留对链接列表的正向搜索以及当前使用现有new\u node->prev=temp;
插入新节点时编写代码的方式保留的反向搜索旧尾部节点的next
指针未设置为指向newly补充道node@LucasRoberts.我还想看看列表的声明
:)哦<代码>列表->上一个,列表头之前的元素,应该总是空的,不是吗?该行将始终seg fault:ASSERT_EQ(列表->上一个->数据,&i)代码>。甚至在卢卡斯·罗伯茨提出的修复方案之后。