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

int *ptr; ... realloc(ptr,++count*sizeof(int)); or ptr=realloc(ptr,++count*sizeof(int)); 

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

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

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

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 */ } 

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

如果realloc失败,它将返回一个空指针,并且传递给它的指针仍然有效。

realloc的实际实现是实现定义的,但通常realloc尝试分两步获取更多内存。 首先,它试图查看它是否可以扩展已分配的块而不必将其重新定位到内存中。 如果成功,则realloc不必在内存中移动任何内容,旧指针有效。

但是,可能没有空间将分配的块扩展为新大小。 例如,您可以想象在当前分配的块之后存在另一个已分配内存块,因此无法向前扩展边界。 在这种情况下, realloc必须分配一个全新的内存来存储更大的块,旧的指针将不再有效。 这就是你应该写的原因

 ptr = realloc(ptr, newSize); 

代替

 realloc(ptr, newSize); 

当然,还有其他原因可以解释为什么realloc可以移动内存。 内存分配器可能对内存的不同部分中的块具有特定的大小要求,或者可能尝试通过压缩内存来优化性能。 在任何一种情况下, realloc可能会在不事先通知的情况下移动内存,因此您可能需要更改ptr指向的位置。

希望这可以帮助!