我试图通过遍历列表以创建下一个节点来向链接列表添加项目。列表中的最后一个节点指向新创建的节点。但是我遇到了核心转储分段错误。
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);
}
答案 0 :(得分:1)
这是总结评论的答案。
编写的代码可能至少有3个问题:
当传递代码void linked_list_add(list_node_t *head, void *item)
的参数时,通常希望能够处理NULL
的{{1}}指针。即使head
为null,看起来while循环也会立即进入搜索列表的末尾。
新添加的节点head
将更新new_node
指针,以便向后搜索将是段错误,而不应该是段错误。但是,不会保留 forward 搜索。我的意思是,链接列表中的最后一个非prev
节点没有指向NULL
的{{1}}指针。
测试next
可能访问随机存储器位置或new_node
指针。鉴于OP没有发布ASSERT_EQ(list->prev->data, &i);
结构的声明,因此很难说出默认值是/将是什么。但是,除非该列表是循环的,否则NULL
的值是未初始化的指针。取决于您的设置(例如,如果链表的设置代码将指针设置为null,那么您也可以在其中访问list
指针。
我希望这有助于OP解决其编码问题。