直接用 fwrite 写结构体导致读取错乱是因为编译器对齐填充的 padding 字节也被写入正确做法是手动序列化各字段或谨慎使用 #pragma pack(1)但需注意跨平台兼容性与非 POD 类型如 std::string不可直写。直接用 fwrite 写结构体为什么读出来字段全乱了因为结构体在内存中默认按编译器对齐规则填充fwrite 只是把那一片连续内存原样倒进文件——但对齐字节padding也被写进去了。你没意识到的“空洞”成了读取时的错位根源。常见错误现象int 字段读出来是 0x00001234 变成 0x12340000或字符串首地址变成非法指针根本原因结构体成员间存在未声明的 padding 字节fwrite(s, sizeof(s), 1, fp) 把 padding 也写了进去而读取端若没做相同对齐就直接按字段偏移解包必然错位使用场景跨平台存档、进程间共享二进制数据、性能敏感的日志序列化不追求可读性实操建议要么显式禁用对齐慎用要么手动序列化每个字段推荐#pragma pack(1) 能一劳永逸解决对齐问题吗能压平 padding但只在当前编译单元生效且极易引发隐性崩溃。参数差异#pragma pack(1) 强制 1 字节对齐#pragma pack(4) 是多数 x86 默认值省略参数则恢复默认对齐容易踩的坑#pragma pack 影响所有后续结构体若头文件里没配对 #pragma pack()会导致下游代码结构体布局突变出现难以复现的 segmentation fault兼容性影响ARM64 等架构对非对齐访问可能直接触发 bus error即使 x86 允许性能也会下降CPU 需多周期处理实操建议仅在定义纯数据结构不含虚函数、引用、std::string 等且明确控制整个编译单元时使用写完立刻 #pragma pack() 恢复用 memcpy 手动拷贝字段比 fwrite 效率低吗几乎没差别。现代编译器对固定长度的 memcpy 会内联为单条指令和直接 fwrite 原生结构体耗时基本一致。 Vozo Vozo是一款强大的AI视频编辑工具可以帮助用户轻松重写、配音和编辑视频。