You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

realloc为何清零部分已分配内存?求代码问题排查

问题原因及解决方法

核心错误

你调用realloc时传入的内存大小参数完全错误:

  • 初始malloc(10 * sizeof(uint32_t))分配了能容纳10个uint32_t元素的内存,按uint32_t占4字节的标准实现,总大小是40字节。
  • 但realloc(a, 10)只请求了10字节的内存空间——这仅够放下2个完整的uint32_t(8字节),剩余2字节不足以容纳第三个元素。

为什么会出现部分数据“清零”?

realloc缩小内存块时,只会保证新大小范围内的数据有效,超出新大小的内存会被内存分配器回收,不再属于你的程序。此时访问这些超出范围的元素属于未定义行为:内容可能是随机值、旧数据残留,或者像你看到的被清零——这完全取决于内存分配器的实现,没有任何固定规则。

你看到前4个元素看似正常,其实是巧合:10字节刚好覆盖了前2个完整uint32_t(0、1)和第三个元素的前2字节,而你的系统内存分配器刚好对回收的内存做了部分清零,或者原有内存数据刚好呈现出这个结果,但这不是realloc的刻意行为。

修正后的代码

如果你想保持能容纳10个uint32_t的内存,realloc的第二个参数必须遵循“元素数量 × 元素类型大小”的逻辑:

uint32_t* a = malloc(10 * sizeof(uint32_t));
for (uint32_t i = 0; i < 10; i++) a[i] = i;
for (uint32_t i = 0; i < 10; i++) printf("%d\n", a[i]);

printf("\n\n");

// 正确指定内存大小:10个uint32_t对应的字节数
a = realloc(a, 10 * sizeof(uint32_t));
for (uint32_t i = 0; i < 10; i++) printf("%d\n", a[i]);

free(a);

如果需要调整元素数量(比如扩大到20个),只需修改元素数量即可:

a = realloc(a, 20 * sizeof(uint32_t));

内容的提问来源于stack exchange,提问作者Sirox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:13:09