【问题标题】:C realloc() function failsC realloc() 函数失败
【发布时间】:2013-09-19 18:17:45
【问题描述】:

为什么这段代码不起作用?

char *x=malloc(100);
x++;
x=realloc(x, 200);

我的意思是 x 是一个有效的字符串指针,只是加一?

【问题讨论】:

  • 因为不是你从malloc()得到的指针...
  • @NoIdeaForName 嗯,这是一个关于 C 的问题。
  • 文档很清楚。将从调用中获得的指针传递给 malloc 或朋友。
  • @PascalCuoq 哦,很公平......

标签: c realloc


【解决方案1】:

请参阅realloc 上的 C 标准(C99、7.20.3.4p3)和我的重点:

void *realloc(void *ptr, size_t size);

如果 ptr 是空指针,则 realloc 函数的行为类似于 malloc 函数 规定的大小。否则,如果 ptr 与先前返回的指针不匹配 calloc、malloc 或 realloc 函数,,或者如果空间已被调用释放 对于 free 或 realloc 函数,行为未定义

在您的情况下,xmalloc 返回,而不是 x + 1。所以你的程序会调用未定义的行为。

【讨论】:

  • @usario 如果您使用++ 递增它,它怎么可能是早先由malloc() 返回的指针?
【解决方案2】:

想想realloc 做了什么。当malloc实际上创建了地址x的指针时,它怎么能free地址x+1的指针?

更具体地说,假设您在地址 0x1000 分配了 100 个字节。现在x 递增,指向 0x1001。然后您在新地址拨打realloc。因为malloccallocrealloc 都没有创建0x1001,realloc 调用使用的free(或等效代码)不知道如何处理0x1001;它甚至无法计算它占用了多少字节的内存。它只知道 0x1000 处的 100 个字节。

malloc 和朋友实现背后的基本思想是跟踪分配的指针和分配的字节数。然后当稍后调用free 时,会查找传递给free 的指针。如果没有对传递给free 的指针的引用,除了崩溃还有什么可做的?对我来说,这比假设您可以继续使用可能有效也可能无效的指针更合乎逻辑。

【讨论】:

    【解决方案3】:
    char *x=malloc(100);
    x++;
    x=realloc(x, 200);
    

    在上面显示的代码中,指针x 指向的地址在调用realloc() 函数之前被更改。这是 C 中未定义的行为。

    【讨论】:

      【解决方案4】:

      这是一个undefined behavior,如果你认为你从malloc()获得了一个指针,这是错误的。

      显然x 是由malloc 返回的,并且在调用realloc() 之前它的值已更改,因此它显示了未定义的行为

      【讨论】:

      • "如果你认为你从 malloc() 获得的指针是错误的。" malloc 返回一个指向新分配内存开头的指针。你想表达什么?
      • @POW:- 我只是想传达 malloc 返回的指针不匹配,那么它是未定义的行为。这里 x 由 malloc 返回,然后它被更新,因此它与 realloc 不匹配导致未定义的行为。如果我得到它的错误,请纠正我!
      • ...和那个不匹配,后面用到realloc,那就是未定义行为
      • @POW:- 是的,先生正是我的意思!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 2021-12-07
      • 2016-11-22
      • 2012-08-20
      • 1970-01-01
      • 2020-03-07
      相关资源
      最近更新 更多