你的问题出在内存对齐上。许多编译器为了效率会对数据结构进行内存对齐,这可能会引入一些填充字节。
在你的例子中,short A 和 short B 各占2个字节,char C 占1个字节。如果编译器按照顺序紧密排列这三个成员,那么结构体的大小应该是5个字节。然而,由于内存对齐的原因,编译器可能会在 char C 后面添加一个填充字节,使得 short A 和 short B 能够对齐到4字节边界(在许多架构中,访问对齐的数据更快)。因此,sizeof(stDat) 返回的可能是6。
你可以通过编译器设置来禁止内存对齐,或者手动调整结构体的成员顺序和填充来控制结构体的大小。但是在大多数情况下,最好让编译器自行处理内存对齐,因为这通常可以提高代码的执行效率。
在Keil中,你可以在项目选项中禁用内存对齐。具体操作是:
- 打开你的Keil项目。
- 在"Project"菜单下选择"Options for Target..."。
- 在弹出的对话框中,展开"C/C++"选项卡,然后选择"Code Generation"。
- 在右侧的"Struct Member Alignment"下拉菜单中,选择"1 Byte"。
- 点击"OK"。
这样设置后,sizeof(stDat) 应该会返回5。但是请注意,这可能会影响代码的执行效率。 |