含const与非const成员的联合体声明及赋值是否为UB?
含const成员的联合的未定义行为问题
先看示例代码:
typedef union { int intval; const int const_intval; } myUnion_t; int main(void) { myUnion_t x = {0}; x.intval = 5; printf("intval = %d\n", x.intval); printf("const_intval = %d\n", x.const_intval); }
问题列表
- 如此定义的
myUnion_t本身是否属于未定义行为(UB)? - 对
intval执行赋值操作是否属于未定义行为(UB)?
问题解答
问题1解答
定义myUnion_t本身完全合法,不属于未定义行为。C标准允许联合的成员带有不同的类型限定符(比如const),联合类型的声明只是明确成员的类型与共享存储的规则,这个过程不存在任何触发未定义行为的条件。
问题2解答
对x.intval赋值不属于未定义行为,原因如下:
- 联合对象
x本身是非const的,它的存储区域具备可修改属性; intval是联合的非const成员,通过它修改联合的存储完全符合C标准规定;- 后续读取
const_intval的操作也合法:两个成员的类型属于兼容类型(int与const int兼容),且共享同一存储区域,读取的是最近修改的值,符合C标准中联合成员访问的规则。
补充说明:测试过的所有编译器(包括C++编译器)均未发出警告,也侧面印证这种写法在编译器实现中是被认可的。
内容的提问来源于stack exchange,提问作者0___________
相关产品推荐
相关产品推荐

