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