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

Posted

技术标签:

【中文标题】将C或C99中的结构数组初始化为所有相同的值[重复]【英文标题】:Initialize an array of structs in C or C99 to all the same values [duplicate] 【发布时间】:2016-10-02 11:59:22 【问题描述】:

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

typedef struct

   int x;
   double y;
 MY_S;

MY_S a[666] = 333, 666.6;

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

【问题讨论】:

是的,只有第一个元素,其余填充0 如果您正在寻找符合标准的方法,不,没有。如果您使用的是 GCC,并且可以使用实现定义的解决方案:***.com/a/207702/3470630 单行调用memset有什么问题? How to initialize all members of an array to the same value @michaelsnowden memset 将所有 bytes 设置为相同的值,因此即使是单个 int 也无法通过对 @ 的单行调用将其初始化为 333 987654327@. 【参考方案1】:

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

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

【讨论】:

【参考方案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】:

引自C99 standard 第 6.7.8 节:

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

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

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

【讨论】:

【参考方案4】:

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

参见 ANSI C89 3.5.7 初始化:

[...]

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

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

[...]

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

【讨论】:

以上是关于将C或C99中的结构数组初始化为所有相同的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在构造函数中将数组初始化为0 [重复]

C语言中如何“指名道姓”的进行初始化

如何将二维数组的所有元素初始化为java中的任何特定值

将数组的所有元素初始化为相同的数字

将数组中的所有元素初始化为 NaN 的最快方法是啥?

关于memset()