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