【问题标题】:Why am I getting segmentation fault on my code?为什么我的代码出现分段错误?
【发布时间】:2019-11-24 23:23:24
【问题描述】:

我正在尝试通过遍历列表来将项目添加到链表中以创建下一个节点。和列表中的最后一个节点指向新创建的节点。但我遇到了核心转储分段错误。

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);
}

【问题讨论】:

  • temp 可以为空吗?
  • 如果你搜索你的环境的调试,你可以得到一个堆栈跟踪,看看发生了什么。
  • 从现在的代码格式来看,您似乎需要(仅)取消注释 temp->next = new_node; 行,它将保留向前搜索您的链接列表以及您当前保留的向后搜索与现有的new_node->prev = temp; 插入新节点时代码的编写方式旧的尾节点的next 指针未设置为指向新添加的节点
  • @LucasRoberts。我也想看看list 的声明:)
  • 哦。 list->prev,列表头部之前的元素,应该始终为NULL,不是吗?此行将始终段错误:ASSERT_EQ(list->prev->data, &i);。即使在 Lucas Roberts 提出的修复方案之后。

标签: c linked-list


【解决方案1】:

这是对 cme​​ts 的总结。

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

  1. 当代码void linked_list_add(list_node_t *head, void *item) 被传递参数时,您通常希望能够处理headNULL 指针。即使head 为空,看起来while 循环也会立即开始搜索列表的末尾。

  2. 新添加的节点new_node 更新了prev 指针,以便向后搜索将不会出现段错误。但是,forward 搜索不会被保留。我的意思是链表中最后一个非NULL 节点没有指向new_nodenext 指针。

  3. 测试ASSERT_EQ(list->prev->data, &i); 可能正在访问随机内存位置或NULL 指针。鉴于 OP 没有发布 list 结构的声明,很难说默认值是/将是什么。然而,除非这个列表是循环的,否则list->prev 的值是一个未初始化的指针。根据您的设置(例如,如果有将指针设置为 null 的链表的设置代码,您也可以在那里访问 NULL 指针。

我希望这有助于 OP 解决他们的编码问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多