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
相关产品推荐
相关产品推荐

