为什么这个结构不是我期望的大小?

Why is this struct not the size I expect?

我正在将文件中的二进制输入输入到缓冲区向量,然后将该缓冲区的指针转换为我的结构类型。

目标是让数据完美地填充结构。

我知道所有不同字段的大小以及它们进入的顺序。

因此,我的结构需要紧密打包且长度为 42 字节。 我的问题是,当我测试它时,它的长度为 44 字节。

此外,第一个值排成一行。之后,数据不正确。

结构如下:

#pragma pack(push, 1)
struct myStruct
{
    uint8_t ID;
    uint32_t size: 24;
    uint16_t value;
    char name[12];
    char description[4];
    char shoppingList[14];
    char otherValue[6];
};
#pragma pack(pop)

Also, the first value lines up. After that, the data is incorrect.

uint32_t size: 24;

如果您想可移植地保证这是在下一个成员之前没有填充的三个字节,您将需要使用字节缓冲区并自己进行转换.

#pragma pack 是一个扩展,位域成员的打包无论如何都是实现定义的。

FWIW GCC 和 CLANG do 似乎在这种情况下做你想做的事,但除非它是由依赖于此的平台 ABI 定义的,否则它仍然很脆弱。