结构体初始化
结构体初始化有多种方式:按顺序初始化、指定成员初始化(C99)、混合初始化等。C99 引入的指定初始化器让结构体初始化更灵活、更清晰,特别适合大型结构体或只需要初始化部分成员的场景。
按顺序初始化
struct Point {
int x;
int y;
};
struct Point p1 = {10, 20}; /* x=10, y=20 */
struct Point p2 = {10}; /* x=10, y=0(剩余成员默认初始化) */
指定成员初始化(C99)
struct Point p3 = {.y = 20, .x = 10}; /* 顺序无关 */
struct Point p4 = {.x = 10}; /* 只初始化 x,y=0 */
嵌套结构体初始化
struct Rectangle {
struct Point top_left;
struct Point bottom_right;
};
struct Rectangle r1 = {
{0, 0},
{100, 100}
};
/* C99 指定初始化 */
struct Rectangle r2 = {
.top_left.x = 0,
.top_left.y = 0,
.bottom_right.x = 100,
.bottom_right.y = 100
};
数组初始化
struct Point points[] = {
{0, 0},
{10, 20},
{.x = 5, .y = 15}
};
运行时初始化
struct Point p;
p.x = 10;
p.y = 20;
/* 或 */
struct Point p = {0}; /* 全部清零 */
memset(&p, 0, sizeof(p)); /* 全部清零 */
常见错误
初始化器过多:
struct Point p = {10, 20, 30}; /* 警告:初始化器过多 */
类型不匹配:
struct Point p = {3.14, 2.71}; /* 警告:double 转 int */
最佳实践
- 优先使用 C99 指定初始化器
- 嵌套结构体用指定初始化器提高可读性
- 不确定时先用
{0}清零 - 大结构体只初始化需要的成员