c-内存错误使用valgrind,strcpy



我一直在使用valgrind,但由于某种原因,我在C

受影响的代码为:

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

字符串为:char*string="你好"。错误为:大小为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)

谢谢你的帮助!

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

您没有考虑结束''。所以应该是(strlen(string) + 1)


旁注:

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

比更易于维护

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

因为你不会重复自己三次。

您的代码已损坏:

  1. 您需要为字符串终止字符分配空间,否则将使strcpy()写入未分配的内存并导致缓冲区溢出错误
  2. 不要将malloc()的返回值强制转换为C
  3. 在写入内存之前,您需要检查分配是否成功

此外,注意sizeof (char)总是1,所以没有必要涉及它。只需使用:

node->entry = malloc(strlen(string) + 1);

或者,检查您是否有strdup(),因为它结合了以上所有功能。

正如@Shahbaz所指出的,在一般情况下,最好在取消引用左侧指针的结果上使用sizeof运算符,以避免重复类型名称:

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

此外,请注意,sizeof不是函数,只有当参数是类型名时才需要括号,而且正如我刚才所说的那样,这种情况是要避免的。

相关内容

  • 没有找到相关文章

最新更新