alteous
alteous

Reputation: 188

"Array index in initialiser exceeds array bounds"

I would like to make use of C99 designated array initialisers to help make my code more self-documenting but I'm running into the problem described below.

Suppose I have a enumeration and an array mapping the enumerants to some other useful data structure, for example:

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

The above compiles with no warnings with TDM-GCC-32 gcc 4.8.1 and -std=c99. The snippet below does not and instead raises the error "array index in initialiser exceeds array bounds".

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 "the index values must be constant expressions, even if the array being initialized is automatic". I've always thought however that enum is a constant expression, so why might this be the case?

Upvotes: 1

Views: 2643

Answers (2)

ShellX3
ShellX3

Reputation: 61

it's not a bug in GCC, but you initializing out of bound.

OK:

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

Error:

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

Fix:

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

Upvotes: 1

gsamaras
gsamaras

Reputation: 73384

The code runs fine, as expected*:

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:~$ 

The problem must lie somewhere else. You also check it live here.

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

Upvotes: 2

Related Questions