"初始化器中的数组索引超出了数组范围"

时间:2016-05-08 11:42:04

标签: c gcc c99

我想利用C99指定的数组初始化程序来帮助我的代码更加自我记录,但我遇到了下面描述的问题。

假设我有一个枚举和一个数组,将枚举映射到其他一些有用的数据结构,例如:

enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC };
int32_t const g_stress_levels[3] = {
        [STATE_IDLE] = 10,
        [STATE_WORKING] = 40,
        [STATE_PANIC] = 90
};

以上编译没有TDM-GCC-32 gcc 4.8.1和-std=c99的警告。下面的代码片段没有,而是引发错误"初始化器中的数组索引超出了数组范围"。

enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC, TOTAL_STATES };
int32_t const g_stress_levels[TOTAL_STATES] = {
        [STATE_IDLE] = 10,
        [STATE_WORKING] = 40,
        [STATE_PANIC] = 90
};

The GCC docs state"索引值必须是常量表达式,即使正在初始化的数组是自动的"。 我一直认为enum是一个常数表达式,为什么会出现这种情况呢?

2 个答案:

答案 0 :(得分:1)

代码运行正常,正如预期的 *

gsamaras@gsamaras-A15:~$ cat px.c
#include <stdint.h>

enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC, TOTAL_STATES };
int32_t const g_stress_levels[TOTAL_STATES] = {
        [STATE_IDLE] = 10,
        [STATE_WORKING] = 40,
        [STATE_PANIC] = 90
};

int main(void) {
    return 0;
}
gsamaras@gsamaras-A15:~$ gcc -Wall -std=c99 -o px px.c
gsamaras@gsamaras-A15:~$ 

问题必定在其他地方。您也可以实时查看here

* <子> Can enum member be the size of an array in ANSI-C?

答案 1 :(得分:0)

这不是GCC中的错误,但是您初始化超出了范围。

确定:

#define profil_a = 0
#define profil_b = 1
foo_ini [ profil_a, profil_b ];

错误:

//#define profil_a = 0
#define profil_b = 1
foo_ini [ profil_b ];

修复:

//#define profil_a = 0
#define profil_b = 0
foo_ini [ profil_b ];