C语言嵌套结构体初始化:哪些元素会被初始化?
C语言嵌套结构体与数组的全零初始化规则
先回顾你给出的结构体定义:
typedef struct { int x; int y; } S; typedef struct { S s1; S s2; } T;
结构体T的初始化问题
使用T t = {};时,整个t会被完全初始化为零值,不需要写成T t = {{}, {}};。根据C标准,当聚合类型(结构体、数组)使用空初始化器{}时,所有未被显式指定初始化的成员都会被自动初始化为对应类型的零值:
- t.s1的x、y字段会被置为0
- t.s2的x、y字段同样会被置为0
普通数组的初始化问题
- 定义
int a[8];时:- 如果是全局变量或静态局部变量,数组所有元素默认被零初始化
- 如果是普通局部变量,元素值是未定义的随机值
- 写成
int a[8] = {};时,无论变量的存储期(全局/静态/局部)如何,所有数组元素都会被置为0
结构体数组的初始化问题
T t_arr[8] = {}; 中的8个T类型对象都会被完全初始化:每个T对象的s1、s2成员的x和y字段都会被置为0。空初始化器会递归作用于数组的每个元素,以及元素内部的嵌套结构体成员。
全零初始化的正确做法
- 对于局部作用域的聚合类型(结构体、数组,包括嵌套结构),直接使用
= {}即可完成全零初始化,无需逐个成员或元素显式编写初始化器 - 对于全局或静态作用域的聚合类型,即使不写初始化器,也会自动被零初始化;显式写
= {}可以更清晰地表达初始化意图
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

