valgrind地址0x421688c在大小为4的块之后是0字节对于具有整数数据的链表有用

时间:2018-03-13 14:25:23

标签: c linux memory-leaks valgrind

虽然有多个线程与

相关
  

valgrind地址0x421688c是一个大小为4的块后的0字节' 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)

请告诉我我做错了什么?

2 个答案:

答案 0 :(得分:3)

您的问题在于您分配的大小。

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"

的类型

答案 1 :(得分:1)

您正在为指针分配空间到lnode,实际上是平台上任何指针的大小(32位系统上的4个字节,8 64位系统上的字节数),但是你需要为结构lnode分配空间,这是指针指向的东西。

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