我不明白为什么会出现此 valgrind 错误
I don't understand why I get this valgrind error
我得到了以下代码:
/* main.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (){
int i;
char *msg = "This is a simple and small message";
int len = strlen (msg);
char *new_msg = (char *) malloc (len);
for (i = 0; i < len; i++)
new_msg[i] = 'A';
printf ("%s\n", new_msg);
free (new_msg);
return 0;
}
我编译了它,然后 运行 它使用 valgrind 和这个命令:
valgrind --leak-check=full --show-reachable=yes ./main
我得到了这个输出:
==8286== Memcheck, a memory error detector
==8286== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==8286== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==8286== Command: ./main
==8286==
==8286== Invalid read of size 1
==8286== at 0x4C2C1B4: strlen (vg_replace_strmem.c:412)
==8286== by 0x4EA09FB: puts (ioputs.c:36)
==8286== by 0x400636: main (main.c:12)
==8286== Address 0x51de062 is 0 bytes after a block of size 34 alloc'd
==8286== at 0x4C28C20: malloc (vg_replace_malloc.c:296)
==8286== by 0x400601: main (main.c:9)
==8286==
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
==8286==
==8286== HEAP SUMMARY:
==8286== in use at exit: 0 bytes in 0 blocks
==8286== total heap usage: 1 allocs, 1 frees, 34 bytes allocated
==8286==
==8286== All heap blocks were freed -- no leaks are possible
==8286==
==8286== For counts of detected and suppressed errors, rerun with: -v
==8286== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
我看到所有分配的内存都被释放了,但我仍然得到一个我不明白的错误。
感谢帮助。
这是一个非常简单的错误:new_msg
的读取无效,因为空终止符不存在。
您分配的 char
数量等于原始字符串的长度,因此目前没有 space 适合 '[=13=]'
而不会产生未定义的行为。按如下方式更改代码以解决问题:
char *new_msg = malloc (len+1);
for (i = 0; i < len; i++)
new_msg[i] = 'A';
new_msg[len] = '[=10=]';
您的代码中有很多地方需要更改。
1) len
应该是 size_t
而不是 int
,因为 strlen()
returns 类型是 size_t
2) (char *) malloc (len);
放弃施法。这不是错误,尽管有一些不应该投射的原因。
3) new_msg
不是 NULL 终止的 [=17=]
。这就是错误发生的原因。
您使用 strlen()
获取长度,但不包含 '\0'。
所以当你 malloc 一个新数组时,你应该使用 len + 1
,并设置 new_msg[len]
为 '[=13=]'
.
我得到了以下代码:
/* main.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (){
int i;
char *msg = "This is a simple and small message";
int len = strlen (msg);
char *new_msg = (char *) malloc (len);
for (i = 0; i < len; i++)
new_msg[i] = 'A';
printf ("%s\n", new_msg);
free (new_msg);
return 0;
}
我编译了它,然后 运行 它使用 valgrind 和这个命令:
valgrind --leak-check=full --show-reachable=yes ./main
我得到了这个输出:
==8286== Memcheck, a memory error detector
==8286== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==8286== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==8286== Command: ./main
==8286==
==8286== Invalid read of size 1
==8286== at 0x4C2C1B4: strlen (vg_replace_strmem.c:412)
==8286== by 0x4EA09FB: puts (ioputs.c:36)
==8286== by 0x400636: main (main.c:12)
==8286== Address 0x51de062 is 0 bytes after a block of size 34 alloc'd
==8286== at 0x4C28C20: malloc (vg_replace_malloc.c:296)
==8286== by 0x400601: main (main.c:9)
==8286==
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
==8286==
==8286== HEAP SUMMARY:
==8286== in use at exit: 0 bytes in 0 blocks
==8286== total heap usage: 1 allocs, 1 frees, 34 bytes allocated
==8286==
==8286== All heap blocks were freed -- no leaks are possible
==8286==
==8286== For counts of detected and suppressed errors, rerun with: -v
==8286== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
我看到所有分配的内存都被释放了,但我仍然得到一个我不明白的错误。
感谢帮助。
这是一个非常简单的错误:new_msg
的读取无效,因为空终止符不存在。
您分配的 char
数量等于原始字符串的长度,因此目前没有 space 适合 '[=13=]'
而不会产生未定义的行为。按如下方式更改代码以解决问题:
char *new_msg = malloc (len+1);
for (i = 0; i < len; i++)
new_msg[i] = 'A';
new_msg[len] = '[=10=]';
您的代码中有很多地方需要更改。
1) len
应该是 size_t
而不是 int
,因为 strlen()
returns 类型是 size_t
2) (char *) malloc (len);
放弃施法。这不是错误,尽管有一些不应该投射的原因。
3) new_msg
不是 NULL 终止的 [=17=]
。这就是错误发生的原因。
您使用 strlen()
获取长度,但不包含 '\0'。
所以当你 malloc 一个新数组时,你应该使用 len + 1
,并设置 new_msg[len]
为 '[=13=]'
.