调用malloc(sizeof(x))时会自动使用x初始化已分配内存吗?
结论
tmp = malloc(sizeof(x)); 的效果完全不等同于 tmp = malloc(sizeof(x)); *tmp = x;,malloc仅完成内存分配操作,不会自动初始化申请到的内存,初始化工作必须由开发者自行完成。
malloc的具体行为规则
- 调用
malloc申请内存时,函数仅负责在堆区开辟指定大小的连续内存空间,返回指向该空间起始位置的指针,不会对内存里的原有数据做任何修改。 - 新申请到的内存块中存储的是未定义的垃圾值(本质是这块内存之前被使用时残留的数据),直接读取解引用后的指针值属于未定义行为,结果不可预测。
- 如果需要让新申请的内存存储变量
x的值,必须手动执行*tmp = x;完成赋值,不存在自动拷贝初始化的逻辑。
注意区分和其他内存分配函数的差异:
calloc虽然会在分配内存后自动将所有字节置0,但同样不会自动写入你指定的自定义变量值;realloc调整内存大小后,新增的内存区域内容同样是未定义的垃圾值。
常见误区说明
部分开发者偶尔会遇到“没手动赋值,*tmp的值刚好和x一致”的情况,这只是新申请到的内存块残留数据刚好和x的字节内容重合,属于极小概率的巧合,绝对不能依赖这种行为写代码,否则程序在不同环境、不同运行状态下会出现难以排查的随机bug。
内容的提问来源于stack exchange,提问作者user14857007
相关产品推荐
相关产品推荐

