2016-04-25 23 views
2

In C kann mit variabler Größe Arrays nicht initialisiert werden, dhWarum wird ein Array mit konstanter Länge vom Compiler als Objekt mit variabler Größe betrachtet?

int size = 3; 
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */ 

Wir definieren size als Pre-Prozessor-Makro, damit es funktioniert:

#define size (3) 
int array[size] = {1, 2, 3}; /* works */ 

Ich würde es vorziehen, zu verwenden, anstelle von Makro-Konstanten, so würde Ich mag tun:

const int size = 3; 
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */ 

Frage: Warum diese letzte var iant nicht arbeiten? Wenn const dem Compiler sagt, dass ich nicht die Absicht habe, die Variable zu ändern, warum folgert er nicht, dass das Array nicht variabel ist?

Ich habe auch versucht ohne Erfolg size statisch, zu machen:

static const int size = 3; 
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */ 

Hinweis: Ich weiß, dass ich nur Jedoch

int array[] = {1, 2, 3}; 

tun könnte, wird size später verwendet, um über iterieren Ich möchte, dass der Compiler eine Warnung ausgibt, wenn size nicht mit der tatsächlichen Größe des Arrays übereinstimmt.

+0

Dies ist kein Standard-C89-Konstrukt, oder? Was ist der Compiler? –

+0

Auf welches Konstrukt beziehen Sie sich? Alles kompiliert (mit den angegebenen Fehlern) mit gcc-3.4.4 mit std = C89 (mit Ausnahme der // - Stil Kommentare, die ich behoben habe) – mort

+0

"Variable Länge automatische Arrays sind in ISO C99 erlaubt, und als Erweiterung GCC akzeptiert sie im C90-Modus und in C++. " –

Antwort

0

Ich habe herausgefunden, warum weder eine Variable vom Typ const int noch verwendet werden kann, um ein Array zu deklarieren: Die Array-Größe muss ein konstanter Ausdruck sein. In C ist ein konstanter Ausdruck etwas wie eine Literalkonstante oder eine sizeof Formel (die letzte nur seit C99), ABER KEINE const Variable. Seltsamerweise ist eine const Variable in C++ ein konstanter Ausdruck und kann zum Deklarieren eines Arrays verwendet werden.

0

Gcc documentation sagt

Die Lagerung am Ort der Erklärung zugeordnet ist

für variabler Größe Arrays.

Damit ein Array initialisiert wird, muss sein Speicher zur Kompilierungszeit zugewiesen werden.

Es ist der Optimierer, der eine const-Variable in eine Konstante verwandelt. Damit ein Programm jedoch optimiert werden kann, muss es zunächst gültig sein.