【问题标题】:What are the contains of the extended memory obtained using realloc?使用 realloc 获得的扩展内存包含哪些内容?
【发布时间】:2019-03-06 13:17:28
【问题描述】:

当我使用realloc 重新调整我之前使用calloc 初始化的内存(一个数组)时,它在整个缓冲区中是否仍然保持为0?还是新部分没有初始化?

【问题讨论】:

    标签: c realloc


    【解决方案1】:

    考虑到您正在增加分配内存的大小,扩展内存区域将具有不确定的值。

    引用C11,第 7.22.3.5 章,(强调我的

    [...] 新的内容 对象应与释放前的旧对象相同,直至两者中的较小者 新旧尺寸。 新对象中超出旧对象大小的任何字节都有 不确定的值。

    【讨论】:

    • 谢谢!我明白了!
    【解决方案2】:

    不,很遗憾realloc 不会初始化分配的“新”部分。所以你必须自己做。不过,“旧”部分将保持其价值,因此,如果您不更改它,您所有的 0s 仍将存在。

    【讨论】:

    • 我以前从未想过这个问题,但这是一种奇怪的不对称。你会认为图书馆要么提供crealloc,要么不提供calloc。提供一个方便的功能有点奇怪,但不是更难手动实现。
    • @Leushenko 用例是什么?如果内存正在扩展,则假设要 store (write) 一些东西 - 为什么你还需要初始化它?
    • @SouravGhosh 我认为这个问题同样适用于calloc(我会从库中删除calloc,并让优化器在需要时检测memset)。如果你能证明一个,你就可以证明另一个。例如,如果您使用 calloc 分配了一个大的归零数组,现在想要将大小加倍。
    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多