当新大小与旧大小相同时,realloc的行为

时间:2013-09-04 15:15:02

标签: c memory realloc

我正在努力提高代码效率。我有这样的事情:

    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将如何表现。这个电话会被忽略吗?

3 个答案:

答案 0 :(得分:8)

未在标准C中指定。所有标准C保证:新对象的内容应与解除分配前旧对象的内容相同,直至新旧尺寸中的较小者。

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

  

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

C标准没有具体说明会发生什么,因此您将受到实施的支配。我无法想象任何不会返回传入指针的半实体实现,但安全选项是检查您自己的代码中的分配大小是否已更改。这也肯定会跳过函数调用。

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