realloc是否会覆盖旧内容?

fud*_*din 33 c realloc

当我们通过重新分配内存时realloc(),先前的内容是否被覆盖?我正在尝试创建一个程序,每次我们输入数据时重新分配内存.

请通过realloc告诉我有关内存分配的信息,例如编译器依赖吗?

pmg*_*pmg 82

不要担心旧内容.

正确的使用方法realloc是使用特定的指针进行重新分配,测试指针,如果一切正常,则更改旧指针

int *oldpointer = malloc(100);

/* ... */

int *newpointer = realloc(oldpointer, 1000);
if (newpointer == NULL) {
    /* problems!!!!                                 */
    /* tell the user to stop playing DOOM and retry */
    /* or free(oldpointer) and abort, or whatever   */
} else {
    /* everything ok                                                                 */
    /* `newpointer` now points to a new memory block with the contents of oldpointer */
    /* `oldpointer` points to an invalid address                                     */
    oldpointer = newpointer;
    /* oldpointer points to the correct address                                */
    /* the contents at oldpointer have been copied while realloc did its thing */
    /* if the new size is smaller than the old size, some data was lost        */
}

/* ... */

/* don't forget to `free(oldpointer);` at some time */
Run Code Online (Sandbox Code Playgroud)

  • 在`oldpointer = newpointer之后;`两个指针都指向相同的内存区域.做`free(newpointer);`和`free(oldpointer);`一样.你不想以任何方式搞乱`newpointer`:忘记它存在. (7认同)
  • @barnes:是的,当`realloc()`"工作"时,它自动相当于在旧的内存块上调用`free()`; 见[C11 7.22.3.5](http://port70.net/~nsz/c/c11/n1570.html#7.22.3.5)*"realloc函数解除分配旧对象......"*. (4认同)
  • 在oldpointer = newpointer;之后,应该释放newpointer还是必须保留它? (3认同)
  • 让我们假设`oldpointer`指向一个带**地址的内存块:**`0xaaaaaa`做**这个:**`int*newpointer = realloc(oldpointer,1000);`,`realloc`将尝试分配如果可能,内存到同一个块,如果不是,它将搜索另一个内存块(*当然大于旧的*).假设新块位于**地址:**`0xbbbbbb`.现在成功重新分配内存会发生什么**地址:**`0xaaaaaa`及其内容.在成功重新分配内存时,`realloc`是否在旧内存块上调用`free()`? (3认同)

Chr*_*isW 11

它增加已经分配的内存而不覆盖现有内容,或者(如果它无法增长)它在不同的位置分配新的更大的内存,并将现有内容从先前的内存复制到新的内存中.

  • 如果realloc失败,你的`ptr`指向NULL并且旧的ptr丢失(读为`内存泄漏') (3认同)

jha*_*ott 9

您应该编程,好像旧指针被覆盖一样,是的.旧内存不再分配,因此可以由程序的另一部分(例如系统线程)重新分配,并在调用realloc后随时写入.

新内存将始终包含旧内存中存在的相同数据(必要时会为您复制),但只能达到旧块的大小,最后分配的任何额外空间都将是未初始化的.

如果你想要一个副本,那么做一个新的malloc并使用memcpy.

实现方面,当您调用realloc来增加大小时,可能会发生以下情况之一:

  • 分配新块并复制旧存储器的内容,释放旧块,返回新指针.
  • 如果未分配块之后的区域,则可以扩展现有块并返回相同的指针.

既然你无法知道发生了什么,或者即使使用了与上面提到的完全不同的实现,你也应该根据realloc的规范进行编码,这就是你不能再使用旧的指针而你必须使用新的.


R..*_*R.. 5

很难说出你在问什么,但如果你问你是否可以阅读传递给旧地址的"旧内容" realloc,答案是否定的.在某些情况下,您可能会在那里找到部分或全部旧内容,但除非realloc返回传递给它的相同指针,否则对旧指针的任何使用都是未定义的行为.

如果您只是询问旧内容是否会保留在返回的新地址中realloc,则答案为是(最大为旧尺寸和新尺寸).