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失败,则返回空指针,并且传递给它的指针仍然有效.