c - 即使通过指针分配,位域的大小也会被保存吗?
问题描述
假设我有
struct foo
{
unsigned int bar : 7;
unsigned int next_field : 1;
}
void funct()
{
struct foo demo;
demo.next_field = 0;
unsigned char *barptr = (unsigned char *)&demo;
/*1 = 00000001, bar can contain only 7 bits*/
*barptr = 1;
}
因为bar
7 位和char
8 位一样,会发生什么?bar 会用零填充,next_field 是否包含 1?结果会是:
0000000 1
|_____| |_|
bar
或者
0000001 0
|_____| |_|
bar
或者:
0000000 0
|_____| |_|
bar
我会使用我的编译器进行检查,但我不知道这种行为是否是实现定义的,以防万一编译器具有误导性。
解决方案
6.5.3.2 地址和间接运算符
一元运算
&
符的操作数应该是一个函数指示符、一个[]
或一元运算符的结果*
,或者是一个左值,它指定一个不是位域且未使用register
存储类说明符声明的对象。
您不能获取位域的地址。这个动作在 C 中是非法的。
推荐阅读
- python - PyTouchBar:没有名为 Foundation 的模块
- javascript - 无法使用 ERR_CERT_COMMON_NAME_INVALID 在 CodeSandbox.io 上获取 API?
- bluetooth-lowenergy - (ESP-IDF) 通过 BLE 发送 .txt 文件(日志数据)?(从 ESP32 到 Android 手机的大文件)
- postgresql - 为什么我在恢复我的数据库时收到错误代码失败,退出代码为 1
- python - 我在 python 中收到此错误:“AttributeError:'str' 对象没有属性'set'”。我正在使用 tkinter,我该如何解决这个问题?
- typescript - Firebase:在与 Firestore 的交易中使用转换器
- c# - TLSharp 库能够发送带有“粗体”、“斜体”的消息吗?
- javascript - 如何仅在 H3 中获取 hexRing() 的外边缘的顶点?
- html - 如何让这个侧边栏出现在右边而不是左边?
- javascript - 在 ElasticSearch 中为文档字段赋予不同的优先级