valgrind 地址 0x421688c 是为具有整数数据的链表分配的大小为 4 的块之后的 0 字节

valgrind Address 0x421688c is 0 bytes after a block of size 4 alloc'd for linked list having integer data

尽管有多个话题与

相关

valgrind Address 0x421688c is 0 bytes after a block of size 4 alloc'd

各种各样的问题,但都是用 strlen 或 '\0' 相关问题表达的,我理解它们。我正在处理整数的链表插入。

void insert_node(lnode **head, int num){
    lnode *temp = NULL;

    temp = calloc(1, sizeof(lnode *));
    if(temp == NULL){
        printf("Memory Allocation failed!\n");
        return;
    }   
    temp->data = num;
    temp->next = NULL;

    if(*head == NULL){
        *head = temp;
    }   
    else{
        temp->next = *head;
        *head = temp;
    }   
}

我执行了插入、删除步骤并获得了摘要(显示最后几行 valgrind 错误,因为错误都在同一个地方):

    > ==3238== 9 errors in context 5 of 5:
    > ==3238== Invalid read of size 4
    > ==3238==    at 0x804873D: display (in /home/skb/santosh_practice/linked_list_progs/single_LL/a.out)
    > ==3238==    by 0x8048636: main (in /home/skb/santosh_practice/linked_list_progs/single_LL/a.out)
    > ==3238==  Address 0x42168fc is 0 bytes after a block of size 4 alloc'd
    > ==3238==    at 0x402C17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    > ==3238==    by 0x8048686: insert_node (in /home/skb/santosh_practice/linked_list_progs/single_LL/a.out)
    > ==3238==    by 0x8048614: main (in /home/skb/santosh_practice/linked_list_progs/single_LL/a.out)
    > ==3238== 
    > ==3238== ERROR
ERROR SUMMARY: 22 errors from 5 contexts (suppressed: 0 from 0)

请告诉我哪里做错了?

你的问题出在你分配的大小上。

lnode *temp = NULL;

temp = calloc(1, sizeof(lnode *));

一定是

lnode *temp = NULL;

temp = calloc(1, sizeof(lnode));

如果你的结构在内存中占用 18 个八位位组,而一个指针占用 8 个八位位组,对于第一个代码,你将分配 8 个八位位组而不是 18 个八位位组,这是不够的。

一个永远不会有错误类型的好方法是

lnode *temp = NULL;

temp = calloc(1, sizeof(*temp));

因为 "temp" 是 "lnode *" 的类型,而“*temp”是 "lnode"

的类型

您正在为 指针 分配 space 到 lnode,实际上是 any 指针的大小您的平台(在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节),但是您需要为指针指向的结构 lnode 分配 space。

  • sizeof(lnode *) 指针的大小 (在 32 位系统上通常为 4 个字节,在 64 位系统上通常为 8 个字节。
  • sizeof(lnode) 是结构 lnode 的大小,这取决于结构的定义方式。