C 获取位字段的地址
我要问几个C能力倾向的问题。这个看起来很棘手,有人能解释吗C 获取位字段的地址,c,C,我要问几个C能力倾向的问题。这个看起来很棘手,有人能解释吗 struct { int foo : 4; } baz; int *example() { return &baz.foo; } 这是无效代码,但我无法找出原因 int foo : 4; 将foo声明为位字段。不能取位字段的地址 第6.5.3.2节开始: 一元&运算符的操作数应为函数指示符、[]或一元*运算符的结果,或指定不是位字段且未使用寄存器存储类说明符声明的对象的左值 因此,将地址运算符应用于位字段是
struct {
int foo : 4;
} baz;
int *example()
{
return &baz.foo;
}
这是无效代码,但我无法找出原因
int foo : 4;
将foo
声明为位字段。不能取位字段的地址
第6.5.3.2节开始:
一元&
运算符的操作数应为函数指示符、[]
或一元*
运算符的结果,或指定不是位字段且未使用寄存器存储类说明符声明的对象的左值
因此,将地址运算符应用于位字段是违反约束的。(这甚至没有什么意义,因为位字段不需要从字节边界开始。)foo字段是一个4位宽的位字段,比单个字节小。指针只能寻址整个字节,因此这是无效的。即使foo是8或32位宽(在现代体系结构中是完整/对齐的字节),这仍然是无效的。结构中的冒号语法将
foo
声明为位字段
由于位字段可能小于体系结构中最小的可寻址内存块(通常是许多现代CPU体系结构中的字节),因此不允许获取此类成员的地址
因此,此代码无法编译,因为它违反了该规则。我认为,如果编译文件,您将获得以下解决方案:
cannot take address of bit-field
因为在内存体系结构中,每次使用指针时,它都会指向它所指向的地址。但是baz只是一个位字段,所以它将无效。如果使用位字段,请不要使用的地址(或指针)