2017-02-14 95 views
2

所以我想弄清楚为什么用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目前。

+2

第二个问题:你强调的很引用吻合*完美*与你看到的有关零填充的内容。这是* *正好与拥有“静态存储时间”,因此那款精确到正在填充你看到关于第一个元素(一个或多个)哪些对象发生了什么,其余的被零填充。 – WhozCraig

+0

谢谢。 “剩余的聚合将被隐含地初始化” – visc

+0

不客气,“...与具有静态存储持续时间的对象相同”= P – WhozCraig

回答

1

这是因为缺失值会自动初始化为零。如果你想初始化每个元素为1,你需要这个:

int buckets[AS] = {1, 1, 1, ..., 1}; //100 times 

这显然是不可行的。

您也可以阅读这个answer以及。

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; 
} 

,并试图理解为什么输出

enter image description here

即为什么全局/静态对象(如arr1),不会在初始化初始化,但本地/自动/堆栈分配(如arr2)不是。

UPDATE:

节6.7.8初始化C99标准的说:

如果具有自动存储持续时间的对象没有被明确初始化,它的值是不确定的。如果已经静态存储持续时间没有明确地初始化的对象,则:

- 如果它有指针类型,它被初始化为空指针;

- 如果它有算术类型,它被初始化为(正或无符号的)零;

- 如果它是一个聚集体,每一个成员被初始化(递归地)根据这些规则;

- 如果它是联合,第一个命名构件(递归地)根据这些规则进行初始化。

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 }; 
+0

那么,他不能使用gcc扩展,因为他没有使用gcc。 – tofro

+0

这很好理解,但它可能不适用于OP的编译器。 – rici

相关问题