在C中的位字段中,其元素的内存位置是否连续? 如果是,所有编译器的行为是否相同?
示例:
typedef struct
{
uint8_t in_alarm :1;
uint8_t fault :1;
uint8_t overridden :1;
uint8_t out_of_service:1;
}StatusFlag_t;
字段in_alarm,fault等是否有连续的内存位置?
答案 0 :(得分:3)
根据C标准,位域处理的几乎每个方面都依赖于编译器。很可能你的结构中的4位在单个字节中是连续的,但不能保证它们是否是最重要或最不重要的4位。如果超过8位,则值将跨越多个存储单元(因为基类型为uint8_t
;请注意,C标准不要求编译器支持使用uint8_t
作为位域的类型)。注意,位字段成员通常没有不同的地址;你不能获取位字段元素的地址。
无法保证不同编译器在不同平台上的行为相同。通常有一个ABI(应用程序二进制接口),它定义特定O / S的行为,编译器将遵循运行它的平台的ABI。但是C标准没有强制要求这种行为。
对于标准中的相关引用,请参阅(以及其他可能性)How do bit-fields and their alignments work in C programming?
答案 1 :(得分:0)
嗯,他们没有内存位置,因为它们不到字节。你不能把指针指向一个位域。
应尽可能将字段打包在一起。
正式确切的位分配是实现定义的。它可能在编译器之间有所不同。
在实践中,3个主要编译器,Gcc,CLang和VisualC ++也做同样的事情。
答案 2 :(得分:-1)
Bits实际上只在一个内存位置。一个位置对应于8位。 顺序可以是编译器相关的,即结构元素的第一位(在你的情况下是in_alarm)应该在MSB或LSB位置。(至少我的编译器有一个选项来设置它。)
编辑: 由于答案被低估了,我不知道为什么,我正在粘贴我的编译器设置快照来解释我想要表达的内容: