让我们在C或C99中假设以下内容:
typedef struct
{
int x;
double y;
} MY_S;
MY_S a[666] = {333, 666.6};
这是否只初始化数组的第一个对象?如果是,是否有办法使用该语法将数组的所有元素初始化为所有相同的值(不调用函数/循环而不重复初始化器)?
答案 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 */
}