使用Valgrind时出现内存错误,strcpy函数

3

我一直在使用Valgrind,但是用C语言进行简单的字符串拷贝时,即使两个字符串大小相同,我仍然不断遇到内存错误。

受影响的代码如下:

node->entry = (char*)malloc(strlen(string)*sizeof(char));
strcpy(node->entry, string);

使用的字符串是:char* string = "Hello There"。 错误信息为: 写入大小无效,大小为2。
==2035==    at 0xD494: memmove$VARIANT$sse42 (mc_replace_strmem.c:987)
==2035==    by 0x100001793: __inline_strcpy_chk (_string.h:94)
==2035==    by 0x100001699: createList (main.c:10)
==2035==    by 0x100001BE6: main (main.c:132)
==2035==  Address 0x10000c0fa is 10 bytes inside a block of size 11 alloc'd
==2035==    at 0xB823: malloc (vg_replace_malloc.c:266)
==2035==    by 0x100001635: createList (main.c:9)
==2035==    by 0x100001BE6: main (main.c:132)

感谢你的帮助!

2
你的代码太嘈杂了。应该是 node->entry = malloc(strlen(string) + 1) - Kerrek SB
2个回答

5
malloc(strlen(string)*sizeof(char));

您没有考虑到结尾的'\0',所以应该为(strlen(string) + 1)


附注:

type *x;
x = malloc(size * sizeof(*x))

比起其他技术,它更易于维护。
type *x;
x = (type *)malloc(size * sizeof(type));

因为你不需要重复三遍。

4
你的代码有问题:
  1. 你需要为字符串终止字符分配空间,如果不这样做,strcpy()会将内容写入未分配的内存并导致缓冲区溢出。
  2. 在C语言中,不要对malloc()的返回值进行强制类型转换。
  3. 在写入内存之前,你需要检查内存分配是否成功。
此外,需要注意的是,sizeof(char)始终为1,因此没有必要参与计算。只需使用:
node->entry = malloc(strlen(string) + 1);

或者,检查您是否有strdup(),因为它结合了上述所有内容。
在一般情况下,正如@Shahbaz所指出的那样,最好在对左侧指针进行解引用的结果上使用sizeof运算符,以避免重复类型名称。
type *x;
x = malloc(amount * sizeof *x);

同时,请注意,sizeof不是一个函数,只有在参数为类型名称的情况下才需要括号,而正如我刚刚所说,这种情况应该避免使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接