realloc() 可以扩展到(并覆盖)后续数据吗?

Can realloc() expand into (and overwrite) subsequent data?

我现在正在学习 C/C++,对内存分配函数的行为感到困惑,尤其是 realloc().

假设我分配了十个 ints:

int * i = malloc(sizeof(int) * 10);

我使用那个数组一段时间,但后来意识到我需要更多 space,所以我将 i 重新分配给 20 ints:

int * j = realloc(i, sizeof(int) * 20);
i = j;

但是,似乎重新分配之前的堆可能包含一些其他数据紧接着最初分配给 i 的内存space,因为在分配和重新分配之间i 我本可以执行另一个 malloc,这可能会在 i.

之后分配 space

然后,当我重新分配时,似乎添加到 i 的新 space 会立即扩展到(并覆盖)数据。

这会发生什么?如果是这样,我应该怎么做才能避免不小心覆盖数据?

您无需担心 realloc 覆盖任何内容。您也不需要使用中间值来保存新指针,除非您想尝试从 realloc 故障中恢复。如果没有,那么正常的做法是:

ptr = realloc(ptr, new_size);

它将做以下三件事之一:

  1. 如果有足够的未分配 space 来扩展旧指针,那么它可能会这样做,在这种情况下它将 return 原始指针。

  2. 否则它将尝试分配新的space,复制旧数据,并释放旧存储。

  3. 如果无法分配新的 space,它可能 return NULL,就像 malloc 一样。因此,在尝试使用它之前,您应该始终检查 return 值。在 NULL return 的情况下,最简单的操作是打印错误消息并退出。如果你想恢复并继续运行,那么你需要保存旧的指针值,这样你就可以释放它并避免内存泄漏,

请注意,realloc 也可用于缩小和增加存储空间。换句话说,你可以给它一个比之前分配的更小的大小。