我有结构
struct ABC {
int a;
int b;
}
和它的数组为
struct ABC xyz[100];
我想初始化a = 10和b = 20;对于所有数组元素。
哪种方式更好?
答案 0 :(得分:13)
虽然没有特别优雅的方法在C中初始化这样的大数组,但这是可能的。你不必须在运行时这样做,因为一些答案错误地声称。并且不希望在运行时执行此操作,假设数组为const
?
我这样做的方法是定义一些宏:
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
};
}
请注意,可以以任何方式组合这些宏,以进行任意数量的初始化。例如:
#define ABC_INIT_152 ABC_INIT_100 ABC_INIT_50 ABC_INIT_2
答案 1 :(得分:8)
使用GCC,您可以使用其extended syntax并执行:
struct ABC xyz[100] = { [0 ... 99].a = 10, [0 ... 99].b = 20 };
对于便携式解决方案,我可能会初始化一个实例,并使用循环将该实例复制到其余实例:
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];
这对我来说比在循环中使用实际值更干净。可以说在稍高的级别表达了期望的结果。
以上语法([0].a
和[0].b
)不是一个扩展名,它是典型的C99。
答案 2 :(得分:1)
for(unsigned int i=0; i<100; i++)
{
xyz[i].a = 10;
xyz[i].b = 20;
}
答案 3 :(得分:0)
对于将子结构数组中的所有元素初始化为特定的非零默认值,没有明确的语言支持,就像将所有元素初始化为零一样;您必须在编译时在源中显式初始化每个元素,或者您必须编写for()循环并在启动时初始化每个元素。
正如用户@lundin在另一个答案中指出的那样,您可以使用预处理器宏来减少显式初始化这些值所涉及的类型,但就C编译器而言,您仍然是显式初始化每个元素。