在初始化struct或union类型的对象时,初始值设定项必须是成员的非空的,括号括起来的以逗号分隔的初始值设定项列表:
= {表达式,...}(直到C99)= {指定者(可选)表达式,...}(自C99以来)
其中指示符是.表单[索引中的表单成员和数组指示符的各个成员标识符的序列(空格分隔或相邻)]。
所有未明确初始化的成员都会以与具有静态存储持续时间的对象相同的方式隐式初始化。
说明
初始化联合时,初始化程序列表必须只有一个成员,它将初始化联合的第一个成员,除非使用了指定的初始化程序(自C99以来)。
union { int x; char c[4]; }
u = {1}, // makes u.x active with value 1
u2 = { .c={'\1'} }; // makes u2.c active with value {'\1','\0','\0','\0'}
当初始化一个结构时,列表中的第一个初始化器初始化第一个声明的成员(除非指定了指定符)(自C99开始),并且没有指定符的所有后续初始化器(自C99开始)初始化在先前由表达。
struct point {double x,y,z;} p = {1.2, 1.3}; // p.x=1.2, p.y=1.3, p.z=0.0div_t answer = {.quot = 2, .rem = -1 }; // order of elements in div_t may vary
指示符使下列初始化程序初始化由指定符描述的结构成员。然后按照声明的顺序继续初始化,从在指定符描述的声明之后声明的下一个元素开始。struct {int sec,min,hour,day,mon,year;} z = {.day = 31,12,2014,.sec = 30,15,17}; //将z初始化为{30,15,17,31,12,2014}(自C99以来)
提供比成员更多的初始化器是错误的。
嵌套初始化
如果结构体或联合体的成员是数组,结构体或联合体,则大括号括起来的初始化程序中相应的初始化程序是对这些成员有效的任何初始化程序,除了它们的大括号可以省略如下:
如果嵌套的初始化程序以一个左大括号开始,则整个嵌套初始化程序直到其大括号初始化相应的成员对象。每个左开口大括号建立一个新的当前对象。当前对象