2016-11-14 2 views
5

Ich habe eine interessante Tatsache gefunden, und ich habe nicht verstanden, wie es funktioniert.
Das folgende Stück Code funktioniert einfach perfekt.Array-Größe mit const Variable in C

#include <stdio.h> 
int main(){ 
    const int size = 10; 
    int sampleArray[size]; 
    typedef char String [size]; 
    return 0; 
} 

Dann habe ich versucht, nur und nur die konstante Variable mit einem globalen Bereich zu verwenden, und es ist immer noch in Ordnung. Auch ich bekam die folgende

#include <stdio.h> 
const int size = 10; 
int main(){ 
    int sampleArray[size]; 
    typedef char String [size]; 
    return 0; 
} 


Aber wenn ich die Arrays des Oszilloskops auf den globalen Wandel:

error: variably modified ‘sampleArray’ at file scope

#include <stdio.h> 
const int size = 10; 
int sampleArray[size]; 
typedef char String [size]; 
int main(){ 
    return 0; 
} 

Und ich habe es nicht bekommen! Wenn ich die const-Variable für ex ersetzen würde. zu #define wäre es auch okay.
Ich weiß, dass die Variable #define vorverarbeitet ist, und soweit ich weiß, ist die Konstante const nur schreibgeschützt. Aber was macht den globalen Rahmen überhaupt?

Ich verstehe nicht, was das Problem mit dem dritten Stück Code ist, wenn der zweite nur okay ist.

+3

Einige Details: C hat "const" Objekte, aber keine _constant_ one. Obwohl "const" anscheinend _constant_ impliziert, ist ein "const" -Objekt nicht _constant_, sondern eher "dieses Objekt sollte sich nicht ändern, aber wenn eine Änderung versucht wird - wer weiß, was passieren könnte?" In C ist eine wahre _Constant_ ein Code wie "42", der eine _integer Konstante_ mit dem Typ von "int" ist. Daher ist 'const int size = 10;' nicht eine _constant_-Variable. – chux

+0

Das Array hat keine konstante Größe, sondern ist ein Array variabler Länge. – Olaf

+1

Wie sie gesagt haben, hat C 'const' Objekte, die eigentlich nur lesbare * Variablen * sind. Vgl. C++, das wahre "const" Objekte hat, die eigentlich Kompilierzeit * Konstanten * sind. –

Antwort

6

Arrays variabler Länge können nur eine automatische Speicherdauer haben. VLAs wurden in C99 eingeführt.

Es ist nicht eine VLA mit der statischen Lagerdauer, da die Größe von VLA wird zur Laufzeit (siehe unten)

Vor diesem Standard Sie können entweder ein Makro wie

#define SIZE 10 

//... 

int a[SIZE]; 
bestimmt erklären erlaubt

oder ein Enumerator einer Aufzählung wie

enum { SIZE = 10; } 

//... 

int a[SIZE]; 

Durch die Art und Weise Sie die const-Qualifikationsspiel entfernen und schreiben nur

int size = 10; 

statt

const int size = 10; 

(In C++ haben Sie das const-Qualifikationsspiel zu verwenden, obwohl in C++ gibt es keine VLAs sind, außer dass einige Compiler ihre eigenen Spracherweiterungen haben können)

ist berücksichtigen, dass der sizeof-Operator für VLAs zur Laufzeit anstelle der Kompilierungszeit berechnet wird.

+0

Danke, ich habe gerade angefangen, ein bisschen mehr zu verstehen! Wenn ich jedoch ohne const ausprobiere, habe ich denselben Fehler mit dem globalen Gültigkeitsbereich. Aber mit der #define SIZE 10 funktioniert es. –

+0

@ BálintPap Wie ich geschrieben habe, haben VLAs möglicherweise keine statische Speicherdauer, die alle globalen Arrays haben. –

+0

A, hier gehen wir, in Ordnung! Naja, darüber habe ich nie nachgedacht. Ich danke Ihnen für Ihre Erklärung! Ich schätze es! –