![]() |
1
4
单元测试的预期是错误的。它(或它测试的代码)不应该逐字节扫描结构的缓冲区。对于字节精确数据,代码应该在堆栈或堆上显式地创建字节缓冲区,并用每个成员的摘录填充它。通过对整数值使用右移位操作并通过字节类型(如(无符号字符)强制转换结果,可以以与CPU端号无关的方式获得提取。 顺便说一句,你的代码片段写过s2。你可以通过改变这个来解决这个问题
但结果在技术上是“未定义的”,因为结构中的成员对齐是特定于编译器的。 |
![]() |
2
2
|
![]() |
3
1
我们所做的是使用#pragma pack指定对象的大小:
|
![]() |
4
1
请注意,这不是一个“奇怪”的对齐问题。MSVC选择确保结构在64位边界上对齐,因为它有一个64位成员,所以它在结构的末尾添加了一些填充,以确保这些对象的数组中的每个元素都正确对齐。事实上,我很惊讶GCC没有这样做。
|
![]() |
5
1
给出强制对齐的编译器指令的步骤 或者进入项目选项并更改默认结构对齐方式[在代码生成下] |
![]() |
6
0
请注意,显式填充到64位对齐只会隐藏问题。如果您开始天真地嵌套结构,它就会回来,因为编译器仍然会对内部结构的自然对齐方式产生分歧。 |
![]() |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
![]() |
kernel · 打印结构数组内容时出错 2 年前 |
![]() |
mwitz · 在Rust中无法正确写入结构的函数属性 2 年前 |
![]() |
Ulysses · 无法访问结构字段(Rust) 2 年前 |
![]() |
Tor · 使用Box<None>值初始化struct 2 年前 |
![]() |
Yestin · Golang如何初始化数组结构[duplicate] 2 年前 |