c结构数组初始化

我有结构

struct ABC { int a; int b; } 

和它的数组

 struct ABC xyz[100]; 

我想初始化a = 10和b = 20; 为所有数组元素。

哪个更好?

虽然在C中没有特别优雅的方式来初始化这样的大数组,但这是可能的。 你不必在运行时间做,因为一些答案错误地声称。 你不想在运行时做这件事,假设数组是const

我这样做的方式是定义一些macros:

 struct ABC { int a; int b; }; #define ABC_INIT_100 ABC_INIT_50 ABC_INIT_50 #define ABC_INIT_50 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 #define ABC_INIT_10 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 #define ABC_INIT_2 ABC_INIT_1 ABC_INIT_1 #define ABC_INIT_1 {10, 20}, int main() { struct ABC xyz[100] = { ABC_INIT_100 }; } 

请注意,像这样的macros可以以任何方式进行组合,以进行任意数量的初始化。 例如:

 #define ABC_INIT_152 ABC_INIT_100 ABC_INIT_50 ABC_INIT_2 

使用GCC,您可以使用其扩展语法,并执行:

 struct ABC xyz[100] = { [0 ... 99].a = 10, [0 ... 99].b = 20 }; 

对于一个可移植的解决scheme,我可能会初始化一个实例,并使用一个循环来复制该实例:

 struct ABC xyz[100] = { [0].a = 10, [0].b = 20 }; for(size_t i = 1; i < sizeof xyz / sizeof *xyz; ++i) xyz[i] = xyz[0]; 

这比循环中的实际值更清洁。 可以说,在一个稍高的水平上expression所需的结果。

上面的语法( [0].a[0].b不是扩展名,它是典型的C99。

 for(unsigned int i=0; i<100; i++) { xyz[i].a = 10; xyz[i].b = 20; } 

没有明确的语言支持来将子结构数组中的所有元素初始化为特定的,非零的默认值,就像将所有元素初始化为零一样; 你必须在编译时在源代码中明确地初始化每个元素,或者你必须编写一个for()循环,并在启动时初始化每个元素。

正如用户@lundin在另一个答案中指出的那样,可以使用预处理器macros来减less显式初始化这些值所涉及的types,但就C编译器而言,您仍然显式地初始化每个元素。