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

标签 c struct bit-fields

我有一个包含不同大小的位域的结构。有些位域只有 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 中所述。回答类似的问题。

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

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

因此您不能确定两个不同的变量是否会恰好占据它们的位域之和。

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

关于c - 包含用不同类型定义的位域的结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58536919/

相关文章:

c - 在 C 中使用指针和 Strcpy

c - C 中指针的工作

c - read() 调用后 Printf 打印垃圾。偏移量始终打印为 0

c++ 位域和-Wconversion

c++ - 为什么 c 位域中的 unsigned int 值变成了 signed 值?

c - 函数printf()打印退格问题

go - 接口(interface)的结构嵌入, panic : runtime error

c - 指向结构数组的指针数组

c - 如何从字节可寻址数组中解析出 n 位元素