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
相关产品推荐
相关产品推荐

