如何以更紧凑的方式定义并初始化结构体数组?
更紧凑的结构体数组实现方式
当然有更简洁紧凑的写法!你完全可以把结构体数组的定义和初始化合并在一起,不用先声明数组再逐个赋值,这样代码更清爽,可读性也更强。
给你几种实用的方案:
1. 直接在数组定义时完成初始化
这是最直接的紧凑写法,把结构体定义、数组声明和初始化一步到位:
int main() { struct timing_s { int size; double time; } timing[5] = { {(int)1e5, 0.0}, {(int)2e5, 0.0} // 剩余3个元素会被自动初始化为零值:size=0,time=0.0 }; }
这里要注意:C标准规定,如果初始化列表没有覆盖数组的所有元素,剩下的元素会被自动初始化为零值(int类型为0,double类型为0.0),刚好符合你原来把time设为0.0的需求,省得你手动赋值。
2. 结合typedef复用类型的紧凑写法
如果你之后还需要在其他地方复用这个结构体类型,也可以把typedef和数组初始化结合起来,同样很紧凑:
int main() { typedef struct { int size; double time; } timing_s; timing_s timing[5] = { {(int)1e5, 0.0}, {(int)2e5, 0.0} }; }
这种写法既保留了类型别名的便利性,又一次性完成了数组初始化,比你原来分开赋值的代码少了两行冗余操作。
3. 进阶:指定初始化器(C99+)
如果你的编译器支持C99或更高标准,还可以用指定初始化器来灵活初始化特定索引的元素,比如跳过中间元素直接初始化第3个:
int main() { typedef struct { int size; double time; } timing_s; timing_s timing[5] = { [0] = {(int)1e5, 0.0}, [2] = {(int)3e5, 0.0} // 未指定的元素依然自动初始化为零值 }; }
这种写法在需要非顺序初始化时特别有用,代码意图也更清晰。
对比你原来的代码,这些写法把分散的定义和赋值操作合并,既减少了代码量,也让逻辑更连贯。
内容的提问来源于stack exchange,提问作者KcFnMi
相关产品推荐
相关产品推荐

