包含用不同类型定义的位域的结构的大小

Size of a struct containing bitfields defined with different types

我有一个包含不同大小的位域的结构。有些位域只有 1 位,有些是 32 位宽。我将使用从串行通信接收到的缓冲区填充此结构。所以我计划在位域中定义它们,然后使用 memcpy 用接收到的数据包填充缓冲区。

这是我的结构定义:

#pragma pack(push,1)
typedef struct{

    uint32_t    variable1;          //32 bit
    uint16_t    variable2:16;       //16 bit
    uint32_t    variable3:18;       //18 bit
    uint32_t    variable4:10;       //10 bit
    uint32_t    variable5:4;        //4 bit
    uint8_t     variable6;          //8 bit
    uint8_t     variable7:7;        //7 bit
    uint8_t     variable8:1;        //1 bit
    uint8_t     variable9:6;        //6 bit
    uint8_t     variable10:6;       //6 bit
    uint8_t     variable11:7;       //7 bit
    uint8_t     variable12:5;       //5 bit

}error_driver_t;            //Total length should be 15 bytes (120 bit)
#pragma pack(pop)

printf("\r\nSize of error_driver_t: %d\r\n\r\n", sizeof(demoErrorDriver));    //Expected 15, Resulted 20

串行数据包是 15 个字节,所以我希望这个结构也有 15 个字节长,以便正确使用 memcpy。但是当我得到 sizeof(error_driver_t) 时,我得到 20。

当我在同一结构中同时拥有小型和大型类型时,我对如何使用位域感到困惑。

您无法确定一个结构的 sizeof 是否等于其中包含的变量大小的总和。这受到许多因素的影响,包括结构填充、您使用的 pragma 包、您使用的编译器,甚至您的变量在 struct 中的顺序,如 this answer to a similar question 中所述.

除此之外,C 标准还规定:

Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined)

所以你不能确定两个不同的变量是否会恰好占据它们位域的总和。

总而言之,最好的方法是使用多个位掩码 and/or 移位来从数据包中获取所需的值。