calloc分配内存打印值未清零,与malloc输出结果一致问题咨询
问题根因
你的测试结果和calloc/malloc的特性完全无关,问题出在打印代码存在根本性逻辑错误,同时使用了非标准的void*指针算术运算。
错误逻辑详解
你写的打印语句:
printf("statement[%d]: %c\n", n, (char)&statement.obj[n]);
完全没有读取你分配的内存里的存储内容,实际执行逻辑是:
statement.obj是void*类型,存储的是calloc/malloc返回的堆内存起始地址- 依赖编译器非标准扩展,
statement.obj[n]会按1字节偏移计算到第n个字节的位置 - 你额外加了取地址符
&,最终得到的是第n个字节的内存地址本身的数值,而非该地址里存储的内容 - 把地址值强转为
char打印,输出的是地址低8位对应的ASCII字符,和内存初始化状态没有任何关系
这种情况下,只要两次分配得到的内存起始地址的低10位数值是连续递增的,不管用calloc还是malloc,打印出来的字符序列都会完全一致。
正确的测试写法
修改打印逻辑,读取地址指向的存储内容即可:
// 先转成unsigned char*避免void*运算的非标准问题,输出数值更直观 printf("statement[%d]: %d\n", n, ((unsigned char*)statement.obj)[n]);
修改后重新运行,就可以观测到预期效果:calloc分配的内存输出全为0,malloc分配的内存输出为未定义的随机值。
内容的提问来源于stack exchange,提问作者Garrett
相关产品推荐
相关产品推荐

