首页 > 解决方案 > 即使通过指针分配,位域的大小也会被保存吗?

问题描述

假设我有

struct foo
{
unsigned int bar : 7;
unsigned int next_field : 1;
}
void funct()
{
struct foo demo;
demo.next_field = 0;
unsigned char *barptr  = (unsigned char *)&demo;
/*1 = 00000001, bar can contain only 7 bits*/
*barptr = 1;
}

因为bar7 位和char8 位一样,会发生什么?bar 会用零填充,next_field 是否包含 1?结果会是:

0000000  1
|_____| |_|
  bar

或者

0000001  0
|_____| |_|
  bar

或者:

0000000  0
|_____| |_|
  bar

我会使用我的编译器进行检查,但我不知道这种行为是否是实现定义的,以防万一编译器具有误导性。

标签: cstructbit-fields

解决方案


6.5.3.2 地址和间接运算符

一元运算&符的操作数应该是一个函数指示符、一个[]或一元运算符的结果*,或者是一个左值,它指定一个不是位域且未使用register存储类说明符声明的对象。

您不能获取位域的地址。这个动作在 C 中是非法的。


推荐阅读