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

C语言中同类型含位域结构体变量赋值是否属于UB?

同类型含位域结构体变量赋值的行为界定

核心结论

同类型含位域的结构体变量赋值并非未定义行为(UB),Claude的解读存在错误。

C99标准条款6.7.2.1第14款的明确说明

结构体或联合体对象的赋值,是将对象的值作为整体复制,遵循与简单赋值相同的类型约束和转换规则,但有以下例外:结构体或联合体赋值的结果是,左操作数的每个成员被赋予右操作数对应成员的值,如同通过赋值操作;位域的赋值遵循与简单赋值相同的规则,除了被赋值的位域的类型是其指定的类型(即使它是一个位域)。

标准清晰规定,只要两个结构体属于完全相同的类型(包括位域的类型、宽度、布局顺序完全一致),整体赋值时每个成员(含位域)会被逐一赋值,行为完全确定,不属于未定义范畴。

示例代码验证

以下代码的行为是可预期的:

#include <stdio.h>

struct BitFieldStruct {
    unsigned int a : 3;
    unsigned int b : 5;
};

int main() {
    struct BitFieldStruct s1 = {.a = 5, .b = 20};
    struct BitFieldStruct s2;
    s2 = s1; // 同类型含位域结构体赋值
    printf("s2.a = %u, s2.b = %u\n", s2.a, s2.b);
    return 0;
}

执行后会稳定输出s2.a = 5, s2.b = 20,不存在未定义行为。

易混淆的误区

只有当涉及不同类型结构体(即使位域布局相似)之间的赋值,或通过指针强制转换访问位域时,才可能触发未定义行为。同类型结构体的整体赋值,标准已明确其行为的确定性。

内容的提问来源于stack exchange,提问作者huangda1982

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:18:14