为什么不能取位域地址?
如何创建指向位域的指针?
这是代码...
struct bitfield {
unsigned int a: 1;
unsigned int b: 1;
unsigned int c: 1;
unsigned int d: 1;
};
int main(void)
{
struct bitfield pipe = {
.a = 1, .b = 0,
.c = 0, .d = 0
};
printf("%d %d %d %d\n", pipe.a,
pipe.b, pipe.c, pipe.d);
printf("%p\n", &pipe.a); /* OPPS HERE */
// error: cannot take address of bit-field ...
return 0;
}
最佳答案
位域成员(通常)小于指针允许的粒度,即 char
的粒度s(根据 char
的定义,顺便说一句,它被强制要求至少有 8 位长)。因此,常规指针不会削减它。
此外,不清楚指向位域成员的指针的类型是什么,因为要存储/检索这样的成员,编译器必须确切地知道它在位域中的位置(并且没有“常规”指针类型可以携带这样的信息)。
最后,它几乎不是一个要求的功能(位域首先不常见);位域用于紧凑地存储信息或构建标志的打包表示(例如写入硬件端口),您很少需要指向它们的单个字段的指针 - 如果需要,你总是可以求助于常规 struct
并在最后一刻转换为位域。
由于所有这些原因,标准规定位域成员不可寻址,句号。 可以克服这些障碍(例如,通过定义特殊的指针类型来存储访问位域成员所需的所有信息),但这将是该语言的另一个过于复杂的黑暗角落,没有人使用.
关于c - 不能获取位域的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547352/