realloc是否会更改指针地址?

时间:2016-02-15 16:07:13

标签: c function malloc realloc

以此代码为例:

Struct* allocSomething(void) {
    int n; 
    Struct *something = malloc(n*sizeof(Struct));
    return something;
}

Struct* reallocSomething(Struct **s) {
    int n;
    Struct *something = realloc(*s, (n*sizeof(int)) - 1 * sizeof(Struct));
    return something;
}

int main() {
    Struct *point = allocSomething();
    //code does something...
    point = reallocSomething();
    free(point);
}

我的问题是,在致电reallocSomething后,point仍有allocSomething返回的相同地址?例如,如果point的地址为0x01,当此指针由reallocSomething重新分配时,该地址仍为0x01吗?

3 个答案:

答案 0 :(得分:5)

来自realloc的手册页:

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

...

     

realloc()返回指向新分配的内存的指针   对于任何类型的变量适当地对齐并且可以是不同的   来自ptr ,如果请求失败,则返回NULL。如果size等于0,   返回NULL或适合传递给free()的指针。   如果realloc()失败,则原始块保持不变;它不是   释放或移动。

由于realloc可能会将已分配的内存移至新位置,因此您需要对此进行说明。

答案 1 :(得分:2)

不要指望它住在同一个地址。无论出于何种原因,系统都允许将整个事件移动到不同的地址。虽然您要求的内存块较小,并且它应该在逻辑上适合前一个分配空出的空间,但这不是原子操作,任何中断或分时都可能有其他内容占用内存空间。可能还有其他恶作剧者,无论你使用什么系统,但标准方面呢?不要指望地址保持不变。并且不要指望它会改变。

答案 2 :(得分:0)

从标准的角度来看,除非重新分配失败,否则调用它的行为不仅会破坏旧指针标识的存储,还会破坏旧指针本身。如果代码试图通过检查旧指针而不是通过访问旧指针来访问旧指针,则编译器可能会表现出任意和反复无常的方式,即使该指针中的位模式恰好与新指针的位模式完全匹配。

质量实现可能(可能应该)允许程序以某种超出标准要求的方式使用realloc(例如,检查对象是否移动,并重新计算标识对象部分的指针,如果有的话,但不要打扰) (如果没有移动,则进行此类计算),但标准未定义任何方式来通过指示来表明它们是否支持此类构造。