You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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);
}

问题列表

  1. 如此定义的myUnion_t本身是否属于未定义行为(UB)?
  2. 对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___________

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:43:16