c结构数组初始化

Hem*_*ant 5 c arrays structure initialization

我有结构

struct ABC {
  int a; 
  int b;
}
Run Code Online (Sandbox Code Playgroud)

和它的数组

struct ABC xyz[100];
Run Code Online (Sandbox Code Playgroud)

我想初始化它a = 10和b = 20; 对于所有数组元素.

哪种方式更好?

Lun*_*din 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
  };
}
Run Code Online (Sandbox Code Playgroud)

请注意,可以以任何方式组合这些宏,以进行任意数量的初始化.例如:

#define ABC_INIT_152 ABC_INIT_100 ABC_INIT_50 ABC_INIT_2
Run Code Online (Sandbox Code Playgroud)


unw*_*ind 8

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

struct ABC xyz[100] = { [0 ... 99].a = 10, [0 ... 99].b = 20 };
Run Code Online (Sandbox Code Playgroud)

对于可移植的解决方案,我可能会初始化一个实例,并使用循环将该实例复制到其余实例:

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];
Run Code Online (Sandbox Code Playgroud)

这对我来说比在循环中具有实际值更干净.可以说,在稍高的水平上表达了期望的结果.

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