C 为什么只初始化第一个元素?
我试图弄明白为什么初始化一个数组时使用C 为什么只初始化第一个元素?,c,gcc,C,Gcc,我试图弄明白为什么初始化一个数组时使用int bucket[AS]={0}未将所有元素设置为零。也许这是一个编译器优化,在这种情况下,volatile可以接受吗volatile int bucket[AS]={0} 第二个问题,为什么这里只有第一个元素被初始化为1?这不属于: C99[$6.7.8/21] 如果括号内列表中的初始值设定项少于元素或成员 用于初始化已知数组的聚合或字符串文字中的更少字符 小于数组中元素的大小,聚合的其余部分应隐式初始化为与具有静态存储持续时间的对象相同 问题代码:
int bucket[AS]={0}代码>未将所有元素设置为零。也许这是一个编译器优化,在这种情况下,volatile
可以接受吗<代码>volatile int bucket[AS]={0}代码>
第二个问题,为什么这里只有第一个元素被初始化为1
?这不属于:
C99[$6.7.8/21]
如果括号内列表中的初始值设定项少于元素或成员
用于初始化已知数组的聚合或字符串文字中的更少字符
小于数组中元素的大小,聚合的其余部分应隐式初始化为与具有静态存储持续时间的对象相同
问题代码:
#include <stdio.h>
#define AS 100
int buckets[AS] = { 1 };
int main()
{
int i;
for(i = 0; i < AS; i++) {
printf("%d", buckets[i]);
}
return 0;
}
编辑:
顺便说一句,我根本不是一个编译器专家。这是我的编译器控制字符串
-c-cpu Cortex-M4.fp-D\u EVAL-g-O0-apcs=interwork-split\u sections…
当前在没有-c99的情况下运行。这是因为缺少的值会自动初始化为零。如果要将每个元素初始化为1,则需要:
int buckets[AS] = {1, 1, 1, ..., 1}; //100 times
这显然是不可行的
您可能也希望阅读此内容。在引号“…应隐式初始化…”中未提及初始化值,因此数组的其余部分按默认值初始化,对于数字类型,此默认值为0
要继续主题,请尝试以下代码段
#包括
#定义n10
int-arr1[N];
int main()
{
int-arr2[N];
int i;
对于(i=0;i
并试着理解为什么输出是
i、 e.为什么全局/静态对象(如arr1
)在没有初始值设定项的情况下初始化,而本地/自动/堆栈分配(如arr2
)则没有初始化
更新:
第6.7.8节C99标准的初始化说明:
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态存储持续时间的对象,则:
-如果有指针类型,则初始化为空指针
-如果它有算术类型,则初始化为(正或无符号)零
-如果是聚合,则根据这些规则(递归地)初始化每个成员
-如果是联合,则根据这些规则(递归地)初始化第一个命名成员
int buckets[AS] = { 1 };
在这种情况下,您可以省略初始化器的某些部分,相应的元素将被初始化为0
int buckets[AS] = { 1 }; //initialize to 1,0,0,0,0...
如果试图将数组的所有元素初始化为1
,则可以使用以下语法:
int buckets[AS] = {[0 … 99] = 1 };
第二个问题:你强调的引文与你所看到的零填充完全吻合。这正是具有“静态存储持续时间”的对象所发生的情况,因此,该段落与您所看到的第一个填充元素(其余元素为零填充)的情况完全一致。谢谢。“聚合的其余部分应隐式初始化为“欢迎使用”…与具有静态存储持续时间的对象相同”=PDo您有一个int bucket[as]={0}的示例代码>不填充零填充的?您提供的链接是针对后一个问题的;不是前者。你是在使用一些奇怪的嵌入式架构还是什么?编辑:nm。刚刚看到你添加的问题编辑。谢谢。你确定你的编译器符合C99吗?这看起来像是违反标准的行为。不,他不能使用gcc扩展,因为他没有使用gcc。知道这一点很好,但它可能在OP的编译器上不起作用。
int buckets[AS] = {[0 … 99] = 1 };