gpt4 book ai didi

c++ - union typedef 中的冗余字节

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:41:51 27 4
gpt4 key购买 nike

我使用以下结构来格式化 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 个字节,在 srcSpecifierdata 之间放置两个填充字节(因此整个结构对象具有对齐方式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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com