取一个位域的地址

时间:2013-03-19 12:15:31

标签: c

我正在经历几个C aptitude问题。这个看起来很棘手,任何人都可以解释一下吗?

struct {
    int foo : 4;
} baz;

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

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

4 个答案:

答案 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 

因为在内存架构中,每次使用指针时,它都会获取指向的地址。但是巴兹只是一个领域,所以它将是无效的。