c - 不能获取位域的地址

标签 c pointers syntax-error bit-fields memory-address

为什么不能取位域地址?

如何创建指向位域的指针?

这是代码...

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 的粒度s(根据 char定义,顺便说一句,它被强制要求至少有 8 位长)。因此,常规指针不会削减它。

此外,不清楚指向位域成员的指针的类型是什么,因为要存储/检索这样的成员,编译器必须确切地知道它在位域中的位置(并且没有“常规”指针类型可以携带这样的信息)。

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

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

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

相关文章:

c++ - 创建读取面向 Internet 的套接字的守护程序存在哪些安全问题?

c - C 中的指针,导致段错误

c - 取消引用指向 void 数组的指针

python - 如何将参数传递给 Python 中的线程?

检查文件是否存在(由命令行参数给出)

c - 堆栈字符串上 strtok_r 中的段错误

c - 编写 GSM 调制解调器驱动程序?

c - 指针运算出错

perl - 使用运行 perl s/("|' )//命令的 Windows 批处理文件/命令行,如何防止在运算符(operator)预期错误处发现裸字?

python-3.x - 终端机中出现Imaplib语法错误,但IDLE中没有