【问题标题】:memory error using valgrind, strcpy使用 valgrind,strcpy 的内存错误
【发布时间】:2012-09-07 18:07:57
【问题描述】:

我一直在使用 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)

感谢您的帮助!

【问题讨论】:

  • 你的代码里有太多的噪音。应该是node->entry = malloc(strlen(string) + 1)

标签: c malloc valgrind strcpy


【解决方案1】:

您的代码已损坏:

  1. 您需要为字符串终止字符分配空间,否则会使strcpy()写入未分配的内存并导致缓冲区溢出错误。
  2. Don't cast the return value of malloc(), in C.
  3. 您需要在写入内存之前检查分配是否成功。

此外,请注意sizeof (char) 始终为 1,因此无需涉及它。只需使用:

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

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

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

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

另外,请注意sizeof 不是函数,括号仅在参数是类型名称时才需要,并且正如我刚才所说,应避免这种情况。

【讨论】:

    【解决方案2】:
    malloc(strlen(string)*sizeof(char));
    

    你没有考虑结尾'\0'。所以应该是(strlen(string) + 1)


    旁注:

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

    更易于维护
    type *x;
    x = (type *)malloc(size * sizeof(type));
    

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

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 2011-04-08
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2020-08-19
      • 2011-08-02
      • 1970-01-01
      • 2020-12-04
      相关资源
      最近更新 更多