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

时间:2016-06-02 16:14:18

标签: c arrays struct initialization c99

让我们在C或C99中假设以下内容:

typedef struct
{
   int x;
   double y;
} MY_S;

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

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

5 个答案:

答案 0 :(得分:3)

在标准C中,您需要重复初始化程序。在GCC中,您可以使用相同的初始化程序指定要初始化的元素范围,如下所示:

{{1}}

答案 1 :(得分:2)

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

参见ANSI C89 3.5.7初始化:

  

[...]

     

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

     

按指定初始化z的第一列,并用零初始化其余部分。

     

[...]

遗憾的是,没有办法在没有循环遍历数组的情况下初始化数组,调用memset或通过任何其他方式。

答案 2 :(得分:2)

如果我理解正确,您需要查看指定的初始值设定项designated initializers

这是一个GNU C扩展,您可以使用它在一个节目中初始化数组的值。

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

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

在你的情况下,它就像

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

答案 3 :(得分:1)

引自C99 standard第6.7.8节:

  

如果括号括起的列表中的初始值设定项少于元素或成员   用于初始化已知数组的字符串文字中的聚合或更少字符   大小比数组中的元素大,其余的聚合应该是   隐式初始化与具有静态存储持续时间的对象相同。

即。只有第一个元素将初始化为提供的值,而其他元素将用零填充。

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

答案 4 :(得分:0)

我不太了解C,但我可以想象你可以循环并初始化它们吗?

这样:

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 */
}