【发布时间】:2017-02-25 12:29:44
【问题描述】:
int *p=malloc(20);
现在堆将分配 20 字节的内存。并将第一个字节的地址返回给指针p。(假设没有返回NULL指针)。
现在我这样做,
int *q=realloc(p, 40);
现在他们有以下可能性:
1]。 q=p
2]。 q!=p
3]。 q=NULL
忘记了可能性 2 和 3。
现在我写:
free(p);
现在会发生什么?
前 20 个字节将变为空闲,其余字节仍将保持分配状态,还是所有 40 个字节都将空闲或其他?
【问题讨论】:
-
如果
realloc返回一个非空指针,则传入的指针失效(即freed),你不需要自己做。 -
它将释放 40 个字节。只是碰巧它不需要在重新分配中移动任何东西
-
如果
q == p传递给free没有区别,它不知道您使用了什么变量,只知道它的值。但这是不好的做法,我认为这是一个学术问题。 -
这不是你的问题,但标准 C 中没有办法在调用 realloc 之后测试
p==q。如果 realloc 调用移动了内存,则p不是有效指针,p==q可能是未定义的行为(因为p和q不指向同一对象的部分)。 -
@2501 是的,我已阅读您的回答并同意。
标签: c malloc free dynamic-memory-allocation realloc