Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的代码出现分段错误?_C_Linked List - Fatal编程技术网

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)。甚至在卢卡斯·罗伯茨提出的修复方案之后。