float myArray[myArraySize] = {1};
在上面的表达式中,只有第一个元素是初始化为 1。如何使用复合文字(不是 memset)初始化所有元素的值?
我在 unix 上使用 GCC 4.2 进行编译。
这
float myArray[100] = {[0 ... 99] = 1.0};
你是怎么做的。
请参阅GCC 文档中的指定初始化程序,其中说:
要将一系列元素初始化为相同的值,请编写 `[first ... last] = value'。
不,只有第一个元素会被初始化为 1.0。其余部分将被初始化,但按照 C 标准初始化为 0.0。查看C 常见问题以获取更多示例。
从语言标准:
6.7.8 初始化
...
10 如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态存储持续时间的对象未显式初始化,则:
— 如果它具有指针类型,则将其初始化为空指针;
— 如果它具有算术类型,则将其初始化为(正或无符号)零;
— 如果是聚合,则每个成员都根据这些规则(递归地)初始化;
— 如果是联合,则根据这些规则(递归地)初始化第一个命名成员。
...
21 如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的剩余部分应隐式初始化与具有静态存储持续时间的对象相同。
int arr[10]={1}
并int arr[10]={0}
产生完全相同的结果- 元素 0 被初始化为大括号之间指定的任何内容,元素 1 到 9 根据上面的第 10 和 21 段被初始化为 0。它只是看起来不同,因为在一种情况下,显式初始化器与隐式初始化器相同。
不,您需要全部完成。那些没有被指定的被赋予一个默认值,0f
用于浮点数。
float myArray[4] = {1, 1, 1, 1};
您可能会发现一个简单的for
循环将产生最可维护的代码。我当然不会鼓励使用memset
这里。
如何使用这个公式(不是 memset)用一个值初始化所有元素?
带一个循环。您无法使用memset
.
float myArray[myArraySize] = {1};
for (size_t i=0; i<myArraySize; i++)
myArray[i] = 1.;
它可能看起来很难看,但它是 C 的方式(如果你重命名myArraySize
为类似的东西,它会变得更漂亮N
)。或者,如果元素的数量是固定的,您可以只枚举数组,并且可以选择省略大小:
float myArray[] = {1., 1., 1., 1., 1., 1.};
在现代版本的 C 中初始化任何数组会将所有未指定的条目初始化为零。
要将所有未指定的条目初始化为不同的值,可以尝试 memset;但是,这只适用于 char 数组。
对于非字符数组,您必须编写一个循环。