所以我想弄清楚为什么用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;
}
你可以试试这里的代码:http://www.tutorialspoint.com/compile_c_online.php?PID=0Bw_CjBb95KQMZ19sd1Q2azdaT3M
编辑:
从-o0更改optimatization级别设置为默认elmiinates问题。使用STM32 Kiel IDE微控制器。
编辑编辑:
这是造成麻烦的代码。编译器优化带走for loop
?
// Initalize this to 1 as when initalizing to 0 and clearing some elements are non-zero
// Possibly a compiler bug??? Changing optimatization level from -o0 to default elmiinates 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;
}
}
编辑编辑编辑:
我不是一个编译器的人都顺便说一句。这里是我的编译器控制串
-c -cpu Cortex-M4.fp -D__EVAL -g -O0 -apcs=interwork -split_sections ...
运行没有-c99目前。
第二个问题:你强调的很引用吻合*完美*与你看到的有关零填充的内容。这是* *正好与拥有“静态存储时间”,因此那款精确到正在填充你看到关于第一个元素(一个或多个)哪些对象发生了什么,其余的被零填充。 – WhozCraig
谢谢。 “剩余的聚合将被隐含地初始化” – visc
不客气,“...与具有静态存储持续时间的对象相同”= P – WhozCraig