10

我正在尝试使代码更有效。我有这样的事情:

    typedef struct{
    ...
    }MAP;



    MAP* pPtr=NULL;
    MAP* pTemp=NULL;
    int iCount=0;
    while (!boolean){
    pTemp=(MAP*)realloc(pPtr,(iCount+1)*sizeof(MAP));
    if (pTemp==NULL){
    ...
    }
    pPtr=pTemp;
    ...
    iCount++;
    }

内存是动态分配的。我想减少 realloc 调用以使代码更高效。我想知道如果新大小等于旧大小, realloc 会如何表现。电话会被简单地忽略吗?

4

3 回答 3

10

标准 C 中没有规定。所有标准 C 保证的是:新对象的内容应与释放前旧对象的内容相同,直至新旧大小中的较小者。

但是,如果您使用的是 GNU libc,它会明确表示要返回相同的地址,请参阅此处了解详细信息。

如果您指定的新大小与旧大小相同,realloc则保证不会更改任何内容并返回您提供的相同地址。

于 2013-09-04T15:26:32.983 回答
3

如果大小没有改变,我不会指望 realloc 表现为无操作(尽管这样做似乎是合理的),但是你不必:如果 iCount 的值没有改变了,不要调用 realloc。

于 2013-09-04T15:18:50.310 回答
2

C 标准没有具体说明会发生什么,所以你要听从实现的摆布。我无法想象任何半体面的实现不会返回传入的指针,但安全的选择是检查分配的大小是否在您自己的代码中发生了变化。这也肯定会跳过函数调用。

(顺便说一句,请不要从 中转换返回值realloc。这不是必需的,如果您忘记了它可能会隐藏未定义的行为#include <stdlib.h>。)

于 2013-09-04T15:19:19.513 回答