C++中printf打印结构体成员触发Bus error的原因及解决方法
错误原因
- 代码中的
abc* xyz是未初始化的野指针,没有指向任何合法分配的struct abc类型内存空间,本身存储的地址是随机的非法值。 - 后续
xyz->b = 10的赋值操作、printf对xyz->b的读取操作,本质都是对非法内存地址的读写操作,这类内存访问违规会触发Bus Error或段错误崩溃,你遇到的报错就是该违规行为的表现。
解决方案
根据使用场景可以选择以下三种修复方案:
方案1:栈内存分配(适合短生命周期小对象,无需手动管理内存)
直接在栈上声明结构体实例,无需使用指针:
struct abc { float b; }; abc xyz; xyz.b = 10; printf("%f", xyz.b);
方案2:堆内存动态分配(适合长生命周期/大对象场景)
用new为指针分配合法的堆内存,使用完成后手动调用delete释放避免内存泄漏:
struct abc { float b; }; abc* xyz = new abc; xyz->b = 10; printf("%f", xyz->b); delete xyz;
方案3:智能指针管理(C++11及以上版本推荐,无需手动释放内存)
使用标准库的智能指针自动管理动态内存,避免内存泄漏问题:
#include <memory> struct abc { float b; }; auto xyz = std::make_unique<abc>(); xyz->b = 10; printf("%f", xyz->b); // 智能指针离开作用域后自动释放对应的堆内存
内容的提问来源于stack exchange,提问作者user6532
相关产品推荐
相关产品推荐

