C语言中能否赋值或返回存在未赋值成员的结构体?
C语言中部分初始化结构体赋值的未定义行为分析
在C语言里,直接使用未初始化的标量变量属于未定义行为,比如这段代码:
int x; int y = x;
那对于仅部分成员赋值的结构体,像下面这段代码是否会触发未定义行为?
struct Struct { int a; int b; }; struct Struct s; s.a = 1; struct Struct s0 = s; return s; // 假设外层函数有正确的返回类型
结论是:会触发未定义行为。
原因很直接:当你定义struct Struct s;时,结构体的所有成员(包括未赋值的s.b)都是未初始化的不确定值。C标准规定,读取未初始化的标量值(s.b是int类型,属于标量)属于未定义行为——哪怕是通过结构体整体赋值、返回结构体这种间接方式读取未初始化成员,本质上还是读取了不确定值。
具体来说:
s0 = s是结构体整体复制,会把s的所有成员(包括未初始化的s.b)复制给s0,这个过程必然要读取s.b;return s是将整个结构体作为返回值,同样需要读取s的所有成员,包括未初始化的s.b。
这两种操作都涉及读取未初始化的标量值,完全符合未定义行为的触发条件。
内容的提问来源于stack exchange,提问作者CPlus
相关产品推荐
相关产品推荐

