Definiert die Größe des Arrays mit Hilfe der Variablen

7

Ist das in C gültig?

%Vor%

Compiler gibt keinen Fehler bei der Anweisung int a[i]; . Ich bin keine Konstante, dann wie kann es erfolgreich kompilieren? Liegt es daran, dass ich den gcc-Compiler verwende? Ist es in C ++ erlaubt?

    
user221458 02.10.2013, 10:59
quelle

4 Antworten

17

Ja, das gilt ab C99 und wird Array variabler Länge (VLA). Mit anderen Worten, es befindet sich seit rund 14 Jahren in einem offiziellen Sprachstandard.

Nein, in C ++ ist es nicht gültig, sehen Sie sich diese Frage an.

Beachten Sie auch, dass sizeof keine Funktion ist, also als printf("%zu\n", sizeof a); geschrieben werden kann, die auch den richtigen Formatbezeichner für einen size_t -Wert verwendet.

    
unwind 02.10.2013, 11:00
quelle
2

Dies ist gültig C99 es heißt Array variabler Länge ( VLA ) gcc unterstützt VLA als Erweiterung außerhalb von C99 Modus in Bezug auf C ++ beide gcc und clang unterstützen Arrays variabler Länge als Erweiterung, obwohl dies wirklich ein C99 Funktion.

Sie können mit dem -pedantic -Argument in gcc und clang eine Warnung erstellen, die der folgenden ähnelt:

%Vor% Es wird erwartet, dass

sizeof korrekt mit VLA funktioniert, obwohl es anstelle einer ganzzahligen Konstante ausgewertet wird. Obwohl Sie undefiniertes Verhalten in Ihrem Code haben, da Sie den falschen Formatbezeichner für size_t Das ist zu und nicht d . Der C99-Entwurfsstandard im Abschnitt 7.19.6.1 Der fprintf Funktion auf die printf 's Abschnitt verweist für den Formatstring Absatz 9 sagt:

  

Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten nicht definiert. [...]

    
Shafik Yaghmour 02.10.2013 11:41
quelle
0

Ich würde nur die Antwort von unwind hinzufügen, dass es in C ++ 14 Arrays in Laufzeitgröße geben wird, die ziemlich genau so funktionieren wie VLA.

Siehe Kapitel 8.3.4 in N3690 ( array of runtime bound of T )

Sie scheinen in clang-3.3 (in C ++ 1y-Modus) unterstützt zu werden, aber NICHT in GCC 4.8 (die Unterstützung sollte in GCC 4.9 kommen). Wenn Sie den Code im Pre-C ++ 14-Modus (C ++ 03, C ++ 11) schreiben, wird Ihr Code wahrscheinlich kompiliert, aber es sollte eine Warnung über die Verwendung einer C99-Funktion ausgeben, die nicht in C ++ unterstützt wird.

Und du solltest immer mit den meisten pedantischen Warnungen kompilieren:)

    
v154c1 02.10.2013 11:38
quelle
-1
Der Operator

Sizeof ist vom Compiler unabhängig.

Sie können mehr darüber in den folgenden Links lesen:

VLA-as-function-Argument

    
vkulkarni 02.10.2013 11:16
quelle

Tags und Links