为什么不能使用位域的地址?

我该如何指向位域?

这是代码...

struct bitfield {
    unsigned int a: 1;
    unsigned int b: 1;
    unsigned int c: 1;
    unsigned int d: 1;
};

int main(void)
{
    struct bitfield pipe = {
        .a = 1, .b = 0,
        .c = 0, .d = 0
    };
    printf("%d %d %d %d\n", pipe.a,
            pipe.b, pipe.c, pipe.d);
    printf("%p\n", &pipe.a); /* OPPS HERE */
    // error: cannot take address of bit-field ...
    return 0;
}

最佳答案

(通常)位域成员小于指针允许的粒度,即char的粒度(根据char的定义,顺便说一下,其必须至少为8位长)。因此,常规指针不会削减它。

同样,不清楚位字段成员的指针的类型是什么,因为要存储/检索这样的成员,编译器必须准确知道它在位字段中的位置(并且任何“常规”指针类型都不能携带此类信息)。

最后,这几乎不是必需的功能(位域通常不会首先出现)。位域用于紧凑地存储信息或构建标志的打包表示形式(例如,写入硬件端口),很少需要指向它们的单个字段的指针-如果需要,您可以始终求助于常规struct并在最后一刻转换为位域。

由于所有这些原因,该标准表示位字段成员不可寻址。有可能克服这些障碍(例如,通过定义特殊的指针类型来存储访问位域成员所需的所有信息),但这将是另一个没人使用的语言的复杂角落。

关于c - c-无法获取位域的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13547352/

10-11 16:45