当我们通过realloc()
重新分配内存时,先前的内容是否被覆盖?我正在尝试创建一个程序,每次我们输入数据时重新分配内存。
请通过realloc告诉我有关内存分配的信息,例如编译器依赖吗?
答案 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
返回的新地址,答案是肯定的(最新旧尺寸和新尺寸)。