以此代码为例:
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
吗?
答案 0 :(得分:5)
来自realloc的手册页:
void *realloc(void *ptr, size_t size);
...
realloc()返回指向新分配的内存的指针 对于任何类型的变量适当地对齐并且可以是不同的 来自ptr ,如果请求失败,则返回NULL。如果size等于0, 返回NULL或适合传递给free()的指针。 如果realloc()失败,则原始块保持不变;它不是 释放或移动。
由于realloc
可能会将已分配的内存移至新位置,因此您需要对此进行说明。
答案 1 :(得分:2)
不要指望它住在同一个地址。无论出于何种原因,系统都允许将整个事件移动到不同的地址。虽然您要求的内存块较小,并且它应该在逻辑上适合前一个分配空出的空间,但这不是原子操作,任何中断或分时都可能有其他内容占用内存空间。可能还有其他恶作剧者,无论你使用什么系统,但标准方面呢?不要指望地址保持不变。并且不要指望它会改变。
答案 2 :(得分:0)
从标准的角度来看,除非重新分配失败,否则调用它的行为不仅会破坏旧指针标识的存储,还会破坏旧指针本身。如果代码试图通过检查旧指针而不是通过访问旧指针来访问旧指针,则编译器可能会表现出任意和反复无常的方式,即使该指针中的位模式恰好与新指针的位模式完全匹配。
质量实现可能(可能应该)允许程序以某种超出标准要求的方式使用realloc(例如,检查对象是否移动,并重新计算标识对象部分的指针,如果有的话,但不要打扰) (如果没有移动,则进行此类计算),但标准未定义任何方式来通过指示来表明它们是否支持此类构造。