我试图弄清楚为什么用int buckets[AS] = { 0 };
初始化数组并不是将所有元素都设置为零。也许这是一个编译器优化,在这种情况下volatile
是可以接受的吗? volatile int buckets[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;
}
编辑:
将优化级别从-o0更改为默认值可消除此问题。使用STM32 Kiel IDE微控制器。
编辑编辑:
这是引起麻烦的代码。编译器优化远for loop
?
// Initialize this to 1 as when initializing to 0 and clearing some elements are non-zero
// Possibly a compiler bug? Changing optimization level from -o0 to default eliminates the issue
uint16_t pulse_time_hist[NUM_BUCKETS] = {1};
// Resets all values stored in the histogram
void clearHist() {
unsigned int i;
for (i = 0; i < NUM_BUCKETS; i++) {
pulse_time_hist[i] = 0;
}
}
编辑编辑编辑:
我不是btw的编译员。这是我的编译器控制字符串
-c -cpu Cortex-M4.fp -D__EVAL -g -O0 -apcs=interwork -split_sections ...
目前没有-c99运行。
答案 0 :(得分:1)
这是因为缺失值会自动初始化为零。如果要将每个元素初始化为1,则需要具有以下内容:
int buckets[AS] = {1, 1, 1, ..., 1}; //100 times
这显然是不可行的。
您可能还想阅读此answer。
答案 1 :(得分:1)
在引号“...应隐式初始化...”中未提及初始化值,因此默认值初始化数组的其余部分,对于数字类型,此默认值为0.
要继续此主题,请尝试以下代码段
#include <stdio.h>
#define N 10
int arr1[N];
int main()
{
int arr2[N];
int i;
for (i = 0; i < N; i++) {
printf("%d ", arr1[i]);
}
printf("\n");
for (i = 0; i < N; i++) {
printf("%d ", arr2[i]);
}
return 0;
}
并尝试理解输出
的原因即。为什么全局/静态对象(如arr1
)在没有初始化器的情况下初始化,但是本地/自动/堆栈分配(如arr2
)不是。
<强>更新强>
第6.7.8节C99标准的初始化说:
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果是联合,则根据这些规则初始化(递归)第一个命名成员。
答案 2 :(得分:0)
int buckets[AS] = { 1 };
在这种情况下,您可以省略初始值设定项的某些部分,相应的元素将初始化为0
。
int buckets[AS] = { 1 }; //initialize to 1,0,0,0,0...
如果您尝试将数组的所有元素初始化为1
,则可以使用以下语法使用GCC extension:
int buckets[AS] = {[0 … 99] = 1 };