Kann eine const-Variable verwendet werden, um die Größe eines Arrays in C zu deklarieren?
Warum funktioniert der folgende code einen Fehler auslösen?
const int a = 5;
int b[a]={1,2,3,4,5};
Und auch wenn ich versucht zu kompilieren, der code oben ohne "const" - Schlüsselwort, ich habe den gleichen Fehler:
int a = 5;
int b[a]={1,2,3,4,5};
warum ist es so?
Was ist der Fehler, den ich hier mache?
Und auch eine andere Frage:
Wenn die Konstanten ersetzt durch Ihre aktuellen Werte in einem code, ich.e wenn ich eine variable deklarieren, die sagen: const int x= 5;
Ich weiß, dass kein Speicher reserviert im RAM für die variable x, aber Konstante Variablen Bereich in ROM enthält den Wert 5 und x wird einfach ersetzt durch den Wert 5 überall x in dem code erscheint. Aber Wann wird dies geschehen? Kompilierung? Boot-up-Zeit? Preprocessing-Zeit?
PS: ich spreche von Embedded-C - (läuft auf einem Mikrocontroller, etc), nicht C läuft auf meinem desktop. Also das embedded-system ist verpflichtet, einen ROM-Speicher (Flash, EEPROM...). Was würde dann passieren?
InformationsquelleAutor der Frage user1901196 | 2013-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist einfach eine Einschränkung der Sprache. Die Größen der statisch-bounded arrays werden müssen Konstante Ausdrücke, und leider auch in C, dass ist nur so etwas wie ein literal-Konstante oder eine
sizeof
Ausdruck oder dergleichen, aber nicht eineconst
typisierte variable.(Als Simon wies darauf hin, seit C99 gibt es auch Laufzeit-begrenzt arrays, oder "variable-length arrays", dessen Größe gegeben werden kann, indem der Wert der variable. Aber das ist eine andere Geschichte.)
Können Sie daran interessiert zu hören, dass sind die Regeln anders in C++, wo ein
static const int
ist in der Tat ein konstanter Ausdruck sein, und die C++11 auch noch ein neues Schlüsselwort, "constexpr
zu ermöglichen, noch mehr Allgemeine Verwendung von Konstanten Ausdrücken, die umfassen mehr Dinge, deren Wert "vernünftigerweise bestimmt werden zur compile-Zeit".InformationsquelleAutor der Antwort Kerrek SB
In C,
const
ist eine Fehlbezeichnung für nur-lese -.const
Variablen können Ihren Wert ändern, z.B. es ist vollkommen okay zu deklarierendem Sie Lesen können und bekommen einen anderen Wert, mit dem jeder Lesen, aber nicht schreiben. Die Sprachspezifikation so behandelt
const
qualifizierte Objekte nicht als Konstante Ausdrücke geeignet für array-Größen.InformationsquelleAutor der Antwort Jens
2 großen alternativen zu VLA:
enum
und MakrosMit
enum
:Dies funktioniert, da die enum-Mitglieder sind Konstante Ausdrücke: Kann enum-Mitglied werden, die Größe eines Arrays in ANSI-C?
Mit Makros:
Den Vorteil
enum
s ist, dassenum
s haben Raum und sind Teil der compilation Schritt, so können Sie führen, um bessere Fehlermeldungen als gut.Den Vorteil von Makros ist, dass Sie mehr Kontrolle über die Art der Konstanten (z.B.
#define N 1
vs#define N 1u
), währendenum
s fixiert sind einige Implementierung definierter Typ: Ist die sizeof(enum) == sizeof(int), immer? Aber es spielt keine große Rolle in diesem Fall.Warum vermeiden VLA
InformationsquelleAutor der Antwort Ciro Santilli 包子露宪 六四事件 法轮功
EDIT: Gerade gelesen bei wikipedia, dass C11 absteiger array mit variabler Länge, um eine optional Funktion 🙁 Doh! Die erste Hälfte der post kann nicht sein, nützlich, aber in der zweiten Hälfte beantwortet einige deiner anderen Fragen 🙂
Als extra zu Kerrek SB ' s post, C99 (ISO/IEC 9899:1999), hat das Konzept einer variable Länge array. Der standard gibt das folgende Beispiel:
Den
sizeof
- operator wird wie folgt erweitert:Weiteres schönes Beispiel finden Sie aufwikipedia .
Beachten Sie, dass statisch deklariert werden kann array mit variabler Länge.
Als für einige deiner anderen Fragen:
Wenn die Konstante ist eine const-variable dann kann es niemals "ersetzt" werden und konnte auf den immer zugegriffen werden, als ein Bereich des Arbeitsspeichers. Dies ist, weil die Adresse-von-operator
&
noch arbeiten mit Variablen. Allerdings, wenn die variable Adresse wird niemals verwendet, dann kann es "ersetzt" werden und haben keine Speicher. Aus der C-standard:Nächste Frage...
Dies hängt von Ihrem system. Wenn Sie ROM-und der compiler weiß, wo ROM liegt, dann kann es gut sein, platziert in ROM. Wenn es keine ROM die einzige Wahl, die der compiler (auch linker) haben wird, ist RAM.
Wie bereits erwähnt, diese hängt vielmehr davon ab, wie die Konstante verwendet wird. Wenn Sie die Adresse der const-variable wird nie benutzt und der compiler ist clever genug ist, dann bei complilation Zeit. Ansonsten ist der "Ersatz" kommt nie und es ist ein Wert mit einem Speicherort im Arbeitsspeicher, in diesem Fall die Platzierung der Variablen im Speicher passiert, zur link-Zeit. Es wird nie auftreten, während der Vorverarbeitung.
InformationsquelleAutor der Antwort Jimbo