将C或C99中的结构数组初始化为所有相同的值

Initialize an array of structs in C or C99 to all the same values

本问题已经有最佳答案,请猛点这里访问。

假设在C或C99中存在以下情况:

1
2
3
4
5
6
7
typedef struct
{
   int x;
   double y;
} MY_S;

MY_S a[666] = {333, 666.6};

这是否仅初始化数组的第一个对象?如果是,是否有方法使用该语法将数组的所有元素初始化为所有相同的值(不调用函数/循环,也不重复初始值设定项)?


在标准C中,您需要重复初始值设定项。在gcc中,可以使用相同的初始值设定项指定要初始化的元素范围,例如:

1
MY_S a[666] = { [0 ... 665] = {333, 666.0} };


如果我理解正确,你需要看一看指定的初始值设定项指定的初始值设定项

这是一个GNUC扩展,您可以使用它在一次演示中初始化数组的值。

1
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

这将初始化1到元素0到9,2到元素10到99,3到100个元素。

在你的情况下,就像

1
MY_S a[666] = { [0 .. 665] = {333, 666.0} };


这将初始化第一个结构,其他所有内容都归零。

见ANSI C89 3.5.7初始化:

[...]

float z[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };

initializes the first column of z as specified and initializes the rest with zeros.

[...]

不幸的是,如果不循环数组,调用memset或任何其他方法,就无法初始化数组。


引用C99标准第6.7.8节:

If there are fewer initializers in a brace-enclosed list than there are elements or members
of an aggregate, or fewer characters in a string literal used to initialize an array of known
size than there are elements in the array, the remainder of the aggregate shall be
initialized implicitly the same as objects that have static storage duration.

也就是说,只有第一个元素将被初始化为提供的值,而其他元素将被填充为零。

除了循环初始化复杂结构的数组之外(在标准C中),没有其他方法(memset()可用于初始化具有指定值的内存块)。


我真的不知道C,但是我可以想象你可以循环并初始化它们?

这样的:

1
2
3
4
5
6
MY_S* s = malloc(666 * sizeof *MY_S);
for (i = 0; i < 666; i++)
{
    s[i].x = 333; /* or malloc and strcpy */
    s[i].y = 666.6; /* or malloc and strcpy */
}