为什么我的代码出现分段错误?

时间:2019-11-24 23:23:24

标签: 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_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);
}

1 个答案:

答案 0 :(得分:1)

这是总结评论的答案。

编写的代码可能至少有3个问题:

  1. 当传递代码void linked_list_add(list_node_t *head, void *item)的参数时,通常希望能够处理NULL的{​​{1}}指针。即使head为null,看起来while循环也会立即进入搜索列表的末尾。

  2. 新添加的节点head将更新new_node指针,以便向后搜索将是段错误,而不应该是段错误。但是,不会保留 forward 搜索。我的意思是,链接列表中的最后一个非prev节点没有指向NULL的{​​{1}}指针。

  3. 测试next可能访问随机存储器位置或new_node指针。鉴于OP没有发布ASSERT_EQ(list->prev->data, &i);结构的声明,因此很难说出默认值是/将是什么。但是,除非该列表是循环的,否则NULL的值是未初始化的指针。取决于您的设置(例如,如果链表的设置代码将指针设置为null,那么您也可以在其中访问list指针。

我希望这有助于OP解决其编码问题。