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
的大小,这取决于结构的定义方式。
尽管有多个话题与
相关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
的大小,这取决于结构的定义方式。