4

我正在经历几个 C 能力倾向问题。这个看起来很棘手,谁能解释一下?

struct {
    int foo : 4;
} baz;

int *example()
{
    return &baz.foo;
}

这是无效的代码,但我无法弄清楚原因。

4

4 回答 4

7
int foo : 4;

声明foo为位域。不得获取位域的地址。

第 6.5.3.2 节开始:

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

因此,将地址运算符应用于位域是违反约束的。(它甚至没有多大意义,因为位域不需要从字节边界开始。)

于 2013-03-19T12:17:03.273 回答
4

声明中的冒号语法struct声明foo为位域。

由于位域可能小于体系结构的最小可寻址内存块(通常是许多现代 CPU 体系结构上的字节),因此不允许获取此类成员的地址。

因此,此代码无法编译,因为它违反了该规则。

于 2013-03-19T12:18:32.933 回答
2

foo 字段是一个 4 位宽的位字段——小于单个字节。指针只能寻址整个字节,所以这是无效的。即使 foo 是 8 位或 32 位宽(现代架构上的完整/对齐字节),这仍然是无效的。

于 2013-03-19T12:18:13.797 回答
1

我想如果你编译你的文件,你会有解决方案:

cannot take address of bit-field 

因为在内存架构中,每次使用指针时,它都会获取它指向的地址。但是 baz 只是一个位字段,所以它是无效的。

于 2013-03-19T12:21:28.817 回答