c - 赛格夫 : invalig write of size 8 when adding a node to the end of a linked list

标签 c linked-list append singly-linked-list segmentation-fault

我有这个功能:

int  list_add_elem_at_back(list_t *front_ptr, double elem)
{
        list_t  item = malloc(sizeof(list_t));
        list_t  tmp = *front_ptr;

        if (item == NULL)
                return (0);
        item->value = elem;
        item->next = NULL;
        while (tmp != NULL)
                tmp = tmp->next;
        tmp->next = item;
        return (1);
}

它应该将一个节点添加到以 t_list *front_ptr 开头的列表的后面。

仅供引用:list_tnode_t * 的别名。

执行它时,出现 SegV 崩溃,Valgrind 日志如下:

==3814== Invalid write of size 8
==3814==    at 0x4006C1: list_add_elem_at_back (simple_list.c:63)
==3814==    by 0x400A83: populate_list (simple_list.c:181)
==3814==    by 0x400B5C: main (simple_list.c:202)
==3814==  Address 0x521f048 is 0 bytes after a block of size 8 alloc'd
==3814==    at 0x4C2FB6B: malloc (vg_replace_malloc.c:299)
==3814==    by 0x40067D: list_add_elem_at_back (simple_list.c:56)
==3814==    by 0x400A83: populate_list (simple_list.c:181)
==3814==    by 0x400B5C: main (simple_list.c:202)
==3814== 
==3814== Invalid write of size 8
==3814==    at 0x4006EF: list_add_elem_at_back (simple_list.c:66)
==3814==    by 0x400A83: populate_list (simple_list.c:181)
==3814==    by 0x400B5C: main (simple_list.c:202)
==3814==  Address 0x8 is not stack'd, malloc'd or (recently) free'd

第 63 行和第 66 行是 item->next = NULL;tmp->next = item;,这让我觉得它来 self 分配的方式(或者没有?)我对“下一个”节点的内存,但我无法找出问题所在。

感谢任何帮助。

最佳答案

您正在分配 sizeof(list_t),这是一个指针。你必须这样做:

malloc(sizeof(node_t));

正是这个隐藏 * 的糟糕想法的结果。

第二个问题:当headNULL 时,您将向带有&head 的函数传递一个空指针。显然 next 位于偏移量 0x08 处。因为 tmp0,所以 tmp->next 位于 0 + 0x08。可以使用 head = malloc(sizeof(node_t)) 进行快速检查。

关于c - 赛格夫 : invalig write of size 8 when adding a node to the end of a linked list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48104760/

相关文章:

c - 即使我将 include 目录添加到项目中,Visual Studio 2017 也无法打开 "SDL.h"

c - 用于字符串连接的 OpenCL 内核

c - 这个空指针是怎么回事?

c - 为什么在初始化结构时出现段错误?

c - 添加到链接列表帮助?仅限c语言

javascript - 如何在 JQuery 中删除/清空同级并追加

c++ - 在链表中实现 push/pop (C++)

c++程序崩溃链表?

arrays - 奇怪的golang“append ”行为(覆盖 slice 中的值)

c++ - 字符串流变空