realloc是否会覆盖旧内容?

时间:2010-10-03 17:18:01

标签: c realloc

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

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

4 个答案:

答案 0 :(得分:77)

不要担心旧内容。

使用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 */

答案 1 :(得分:11)

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

答案 2 :(得分:9)

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

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

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

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

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

由于你无法知道发生了什么,或者即使使用了与上面建议完全不同的实现,你也应该根据realloc的规范进行编码,这就是你不能使用任何旧的指针更多,你必须使用新的。

答案 3 :(得分:5)

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

如果您只是询问旧内容是否会保留在realloc返回的新地址,答案是肯定的(最新旧尺寸和新尺寸)。