我使用以下结构来格式化 CAN 消息的数据。 messageData.ptr 用于进一步处理。该部分部分用于更好的访问。 问题是为什么在 messageData.srcSpecifier 和 messageData.data 之间多了两个字节
typedef union _MessagePureData_TypeDef
{
signed int S32[1];
unsigned int U32[1];
unsigned short U16[2];
signed short S16[2];
unsigned char U8[4];
} messagePureData;
typedef union _MessageData_TypeDef
{
unsigned char ptr[6];
struct
{
unsigned char srcDevice;
unsigned char srcSpecifier;
messagePureData data;
} section;
} messageData;
示例:
messageData.section.srcDevice = 0xAA;
messageData.section.srcSpecifier = 0xBB;
messageData.section.data.U32 = 0x11223344;
messageData.ptr 包含的结果: [0xAA、0xBB、0x01、0x17、0x44、0x33]
那么 0x01 和 0x17 是从哪里来的??
最佳答案
对齐。
messagePureData
总是与 int
对齐,它可能有 4 个字节大。这意味着 section
肯定是对齐 8 个字节的,在 srcSpecifier
和 data
之间放置两个填充字节(因此整个结构体对象具有对齐方式) 8 和 data
4 之一)。另一方面,ptr
作为数组是连续的,因此它覆盖与两个填充字节相同的存储空间。
| ptr | ptr + 1 | ptr + 2 | ptr + 3 | ptr + 4 | ptr + 5 |
| | | | | |
| srcDevice | srcSpecifier | padding | padding | &data | &data + 1 | ...
^ ^ ^
| Address is multiple of 8 | | Address is multiple of 4
|
|
| Address is a multiple of two;
| Unfeasible address for data.
您可以打包结构来规避此问题。
关于c++ - union typedef 中的冗余字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27188455/