8 Stimmen

C++ int a[n] funktioniert in g++, aber nicht mit vs2008

Ich habe den folgenden Code:

...
int n;
cin >> n;
int numbers[n];
...

Es kompilierte mit NetBeans auf Mac mit g++ (ich glaube) und es kompilierte nicht mit VS2008 auf Windows. Warum ist es so schwer, es mit jedem Compiler zum Laufen zu bringen? Die Größe des Arrays ist bekannt, bevor es zugewiesen wird.

EDIT: Ich weiß von std::vector . Eigentlich war dies Teil einer Hausaufgabe und ich begann es bei der Arbeit auf einem Mac, dann kam ich nach Hause und war überrascht, dass es nicht auf VS2008 funktionierte. Danke für die vielen Antworten. Aber ich finde es immer noch logisch, dass, wenn der Compiler einen Code erzeugen kann wie alloc(123) wo der Wert 123 hart kodiert ist, warum kann es nicht etwas generieren wie alloc(n) wo Sie n von einer Speicheradresse, die eine int n oder so ähnlich. Es scheint einfach logischer zu sein, so etwas standardmäßig zuzulassen.

16voto

Drew Hall Punkte 27579

Obwohl die Größe des Arrays bekannt ist, bevor es zugewiesen wird, ist sie erst zur Laufzeit bekannt. Dies wird als Array mit variabler Länge (VLA) bezeichnet und ist ein C99ismus, der in g++ durch eine Erweiterung unterstützt wird, die standardmäßig aktiviert ist. Um es klar zu sagen: Dies ist nicht konform mit C++ 98/03, und daher hat Visual C++ durchaus das Recht, es abzulehnen.

Wenn Sie wirklich dynamische Größenanpassung zur Laufzeit wünschen, weisen Sie auf dem Heap zu (über new[]). Das wird überall funktionieren, und als Bonus, schützen Sie vor Stapelüberläufen.

12voto

fredoverflow Punkte 245881

Weil die Größe eines Arrays in Standard-C++ eine Kompilierzeitkonstante sein muss (siehe 8.3.4 §1).

12voto

Warum nicht etwas cpp echtes Zeug verwenden wie std::vector<int> dafür

2voto

ruslik Punkte 14336

Etwas Ähnliches kann man auch mit

 int* numbers = (int*)alloca(n * sizeof(int));  // equivalent to int numbers[n]

Diese Funktion wird nicht empfohlen, führt aber bei sorgfältiger Anwendung zu genau demselben Ergebnis.

2voto

josh Punkte 13009

In der Regel sollte die Array-Dimension ein konstanter Ausdruck sein, dessen Wert größer oder gleich eins ist. Konstanter Ausdruck im Sinne von ganzzahligen literalen Konstanten, Enumeratoren oder Konst-Objekten ganzzahligen Typs, die ihrerseits aus konstanten Ausdrücken initialisiert werden. Eine nicht konstante Variable, deren Wert erst zur Laufzeit bekannt ist, kann nicht zur Angabe der Dimension eines Arrays verwendet werden.

Aber die Compiler-Version, die ich verwende, erlaubt die von Ihnen erwähnte Vorgehensweise.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X