1、C90 初始化
在 C90 中,结构体初始化通常是手动完成的,当时并不支持指定初始化器(这个特性是在 C99 中引入的)。需要按照结构体字段的声明顺序来提供初始化值。
#include <stdio.h> struct Point { int x; int y; }; int main() { struct Point p = {1, 2}; // x = 1, y = 2 printf("%s",p); return 0; }
2、C99 及之后指定初始化器
C99 标准引入了 指定初始化器,允许你通过字段名而不是字段的位置来指定结构体成员的值。这增强了代码的可读性,并减少了在字段顺序变化时可能出现的错误。
#include <stdio.h> struct Point { int x; int y; }; int main() { struct Point p = {.x = 1, .y = 2}; // 清晰地指定每个字段的值 return 0; }
3、部分初始化
在初始化结构体时,如果没有显式地初始化某些字段,C99 及之后的标准会自动将它们初始化为 零(对于数值类型)或 NULL
(对于指针类型)。这种特性在只需要初始化某些字段而不需要手动初始化其他字段时非常有用。
#include <stdio.h> struct Point { int x; int y; }; int main() { struct Point p = {.x = 1}; // 只初始化 'x','y' 会默认被初始化为 0 return 0; }
4、零初始化(C99 及之后的标准)
如要将结构体的所有字段初始化为零,可以使用空的花括号 {}
初始化。这在你希望将结构体初始化为已知状态而不需要手动设置每个字段时非常有用。
#include <stdio.h> struct Point { int x; int y; }; int main() { struct Point p = {0}; // x 和 y 都初始化为 0 return 0; }
5、联合体和嵌套结构体
如果结构体包含嵌套的结构体或联合体,可以用类似的方式初始化它们。对于嵌套结构体,可以使用指定初始化器来指定内层结构体字段的值。
#include <stdio.h> struct Point { int x; int y; }; struct Line { struct Point start; struct Point end; }; int main() { struct Line l = {.start = {.x = 1, .y = 2}, .end = {.x = 3, .y = 4}}; return 0; }