Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取位字段的地址_C - Fatal编程技术网

C 获取位字段的地址

C 获取位字段的地址,c,C,我要问几个C能力倾向的问题。这个看起来很棘手,有人能解释吗 struct { int foo : 4; } baz; int *example() { return &baz.foo; } 这是无效代码,但我无法找出原因 int foo : 4; 将foo声明为位字段。不能取位字段的地址 第6.5.3.2节开始: 一元&运算符的操作数应为函数指示符、[]或一元*运算符的结果,或指定不是位字段且未使用寄存器存储类说明符声明的对象的左值 因此,将地址运算符应用于位字段是

我要问几个C能力倾向的问题。这个看起来很棘手,有人能解释吗

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只是一个位字段,所以它将无效。

如果使用位字段,请不要使用的地址(或指针)