C语言结构的初始化

当定义一个结构对象时,如果想显式地初始化它,必须使用初始化列表:该列表放在一组大括号内,以逗号分隔各初始化器(initializer)或者个别结构成员的初始值。

初始化器和成员声明时的顺序有关:第一个初始化器被关联到第一个成员,第二个初始化器被关联到第二个成员,依此类推。当然,每个初始化器必须具有匹配对应成员的类型(或者,能隐式地转换为成员类型)。如下所示:
Song_t mySong = { "What It Is",
                  "Aubrey Haynie; Mark Knopfler",
                  "Mark Knopfler",
                  297,
                  { 9, 26, 2000 }
                };

在该列表中,每个成员都有一个初始化器。因为成员 published 也是结构类型,所以其初始化器是另一个初始化列表。

可以使指定的初始化器个数少于结构的成员个数。在这种情况下,最后没有对应到初始化器的成员会被初始化为 0。
Song_t yourSong = { "El Macho" };

在上述定义之后,除第一个成员以外,yoursong 的所有其他成员都是 0。成员中的 char 数组被赋值为空字符串,而成员 published 则包含无效的日期{0,0,0}。

如果结构对象属于自动存储类别,初始化器可以是非常量表达式。也可以用相同结构类型的已有对象来初始化一个新的自动结构:
Song_t yourSong = mySong;      // 两个结构在一个语句块内,为有效的初始化