将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中的结构数组初始化为所有相同的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章