C语言结构体初始化与复合字面量赋值的结果是否一致?
C语言结构体初始化与复合字面量问题解答
你给出的代码片段如下:
struct Foo { int i; char c; float f; }; int main() { struct Foo f1 = { .i = 1 }; struct Foo f2; f2 = (struct Foo){ .i = 1 }; }
赋值语法名称说明
给f2赋值时使用的语法叫做 复合字面量(Compound Literal),是C99版本标准新增的特性。这种语法可以在代码的任意执行位置创建一个指定类型的无名临时对象,本例中就创建了一个struct Foo类型的临时结构体,通过指定初始化器完成初始化后,将整个结构体的值拷贝赋值给f2。
内容一致性说明
C标准明确保证f1和f2的内容完全一致,核心依据如下:
- 结构体部分初始化规则统一:无论普通对象初始化,还是复合字面量的初始化,只要仅指定了部分成员的初始值,所有未显式赋值的成员都会遵循和静态存储周期对象相同的初始化规则,自动清零:
char类型的成员c会被初始化为\0,float类型的成员f会被初始化为0.0。 - 结构体赋值会完成全量内容拷贝:给f2赋值时,复合字面量生成的临时结构体的所有内存内容会被完整复制到f2的内存空间中,最终两个结构体的所有成员值、内存布局都完全相同。
内容的提问来源于stack exchange,提问作者aryndin
相关产品推荐
相关产品推荐

