为什么这只是初始化第一个元素?

时间:2017-02-14 06:00:35

标签: c gcc

我试图弄清楚为什么用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运行。

3 个答案:

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

并尝试理解输出

的原因

enter image description here

即。为什么全局/静态对象(如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 };