为什么必须为realloc分配指针而不改变内存块中的第一个值?

834*_*457 1 c memory realloc

int *ptr;
...
realloc(ptr,++count*sizeof(int));
      or
ptr=realloc(ptr,++count*sizeof(int));
Run Code Online (Sandbox Code Playgroud)

我注意到如果我多次使用第一个选项,第一个内存地址(ptr指向)的值变为未定义(尽管内存块中的所有其他值都很好,可以通过下标访问ptr).

但是,我假设所有realloc都是缩小或增加内存块的大小,并且ptr仍然指向相同的内存块,并且它的值都不会改变.因此,如果我使用第一个选项,为什么内存块中的第一个地址最终会产生意外值,因为它ptr仍然指向同一个地址?

EDIT: 我确实记得为ptr分配内存,只是没想到它的工作提到.

Kei*_*son 11

返回的指针realloc 可能指向或不指向与传递给它的指针相同的地址.

通常,如果您正在扩展内存块,则可能没有足够的空间来扩展它.在这种情况下,realloc分配新的内存块,将旧对象的内容复制到新分配的块,并返回指向新块的指针.如果你没有将结果分配给指针对象,那么你就丢失了它(旧的块被释放,你不知道新的块在哪里).

realloc如果收缩已分配的块,甚至可以返回指向新分配的内存块的指针.可能有充分的理由从不同的内存区域分配较小的块.

您还需要注意realloc可能会失败.如果是,它返回一个空指针 - 旧指针仍然有效(只是没有指向你想要的大小的内存块).(原则上,realloc即使新大小小于旧大小,也会失败.)因此,除非您对分配失败的响应是中止程序,或者至少是使用指针的部分,您应该分配结果到另一个指针对象:

int *ptr = ...;
int *new_ptr;
new_ptr = realloc(ptr, new_size);
if (new_ptr == NULL) {
    /* ptr still points to the old block of memory; you can try something else */
}
else {
    ptr = new_ptr; /* Now you can forget the old pointer value */
}
Run Code Online (Sandbox Code Playgroud)

如果realloc成功,则返回的指针值有效,并且传递给它的指针无效.

如果realloc失败,则返回空指针,并且传递给它的指针仍然有效.

  • 也许只是提到使用从旧指针派生的任何指针只有在`realloc`失败时才允许:即使旧的与新的按位相同,使用旧指针也是UB并且可以产生*有趣的*体验.另外,`realloc(不是0,0)`很有趣. (2认同)