【发布时间】:2019-03-06 13:17:28
【问题描述】:
当我使用realloc 重新调整我之前使用calloc 初始化的内存(一个数组)时,它在整个缓冲区中是否仍然保持为0?还是新部分没有初始化?
【问题讨论】:
当我使用realloc 重新调整我之前使用calloc 初始化的内存(一个数组)时,它在整个缓冲区中是否仍然保持为0?还是新部分没有初始化?
【问题讨论】:
考虑到您正在增加分配内存的大小,扩展内存区域将具有不确定的值。
引用C11,第 7.22.3.5 章,(强调我的)
[...] 新的内容 对象应与释放前的旧对象相同,直至两者中的较小者 新旧尺寸。 新对象中超出旧对象大小的任何字节都有 不确定的值。
【讨论】:
不,很遗憾realloc 不会初始化分配的“新”部分。所以你必须自己做。不过,“旧”部分将保持其价值,因此,如果您不更改它,您所有的 0s 仍将存在。
【讨论】:
crealloc,要么不提供calloc。提供一个方便的功能有点奇怪,但不是更难手动实现。
calloc(我会从库中删除calloc,并让优化器在需要时检测memset)。如果你能证明一个,你就可以证明另一个。例如,如果您使用 calloc 分配了一个大的归零数组,现在想要将大小加倍。