虽然有多个线程与
相关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)
请告诉我我做错了什么?
答案 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
的大小,它取决于结构的定义方式。