Dynamisches Array
-
Hallo Leute.
Habe mal ne frage zu den dynamischen Arrays und zwar, kann ich bei einem Array, welches ich dynamisch erstelle die Dimension mit einem nicht konstanten Ausdruck initialisieren?
Beispiel:/* dynamic_array */ #include <iostream> using namespace std; int main() { int i; cin >> i; int *ptr = new int[i]; return 0; }Vielen Dank für jede Hilfe

-GhostfaceChilla-
-
GhostfaceChilla schrieb:
Hallo Leute.
Habe mal ne frage zu den dynamischen Arrays und zwar, kann ich bei einem Array, welches ich dynamisch erstelle die Dimension mit einem nicht konstanten Ausdruck initialisieren?Ja, das darfst du. Es ist erlaubt. Dennoch solltest du dir mal
std::vectoranschauen.
-
Und vergiß niemals
delete[].
-
Danke

Ja vector schon klar, aber wollte auch mal bisschen mit den Arrays rumprobieren
Aber warum kann ich die Arrays so initialisieren? Braucht man nicht einen konstanten Ausdruck normalerweise?-GhostfaceChilla-
-
GhostfaceChilla schrieb:
Aber warum kann ich die Arrays so initialisieren? Braucht man nicht einen konstanten Ausdruck normalerweise?
Hmm, die Frage sollte eher lauten, wieso die Größe bei nicht-dynamischen Arrays überhaupt ein konstanter Ausdruck sein muss. In
Cist das ja vollkommen in Ordnung, wieso aber inC++nicht?
-
Warum?
C++ != CSollte aber ein alter Hut sein, diese Information.

-
out schrieb:
Und vergiß niemals
delete[].
Lieber RAII verstehen, ansonsten ist das eh nie exception sicher, auch wenn man nichts vergisst. (Da ist es schon wieder. :D)
GhostfaceChilla schrieb:
Aber warum kann ich die Arrays so initialisieren? Braucht man nicht einen konstanten Ausdruck normalerweise?
Ehm.. weil das.. für diesen Zweck.. da ist. Irgendwie, irgendwie ginge es aber auch anders. Insofern hat out schon recht.
out schrieb:
Hmm, die Frage sollte eher lauten, wieso die Größe bei nicht-dynamischen Arrays überhaupt ein konstanter Ausdruck sein muss. In C ist das ja vollkommen in Ordnung, wieso aber in C++ nicht?
Na ja, C89 kennt jetzt noch keine VLAs. Offen gesagt würde ich mir das für C++ auch nicht wünschen. Der Quatsch macht nur Ärger. Was ich allerdings tatsächlich vermisse ist alloca().
-
Aber warum kann ich die Arrays so initialisieren? Braucht man nicht einen konstanten Ausdruck normalerweise?
Wieso hat noch keiner gesagt, dass das VLAs ein GCC-Feature sind?
Edit²: Also, VL-Stackarrays, ne.
-
GhostfaceChilla schrieb:
Aber warum kann ich die Arrays so initialisieren? Braucht man nicht einen konstanten Ausdruck normalerweise?
ptr ist kein Array sondern ein Zeiger!
-
Sone schrieb:
Wieso hat noch keiner gesagt, dass das VLAs ein GCC-Feature sind?
Weil die Aussage falsch ist?
-
GhostfaceChilla schrieb:
Danke

Ja vector schon klar, aber wollte auch mal bisschen mit den Arrays rumprobieren
Aber warum kann ich die Arrays so initialisieren? Braucht man nicht einen konstanten Ausdruck normalerweise?-GhostfaceChilla-
Weil normale, micht mit new allozierte Speicherbereiche auf dem Stack angelegt werden, und zwar zu Compile-Zeit und nicht Laufzeit. Daher muss der Compiler vorher wissen, wie groß die einzelnen anzulegende Bereiche sein sollen -> konstanter Ausdruck, konstante und bekannte Größe.
Mit new allozierte Speicherbereiche werden auf dem Heap angelegt, zur Laufzeit. Daher interessiert es den Compiler zu Compile-Zeit nicht, wie groß dein Array ist.
-
truuth schrieb:
Sone schrieb:
Wieso hat noch keiner gesagt, dass das VLAs ein GCC-Feature sind?
Weil die Aussage falsch ist?
Ach halt die Klappe...
Haste meine Editierung nicht gesehen oder hast du nur keine Ahnung?
-
Sone schrieb:
truuth schrieb:
Sone schrieb:
Wieso hat noch keiner gesagt, dass das VLAs ein GCC-Feature sind?
Weil die Aussage falsch ist?
Ach halt die Klappe...
Haste meine Editierung nicht gesehen oder hast du nur keine Ahnung?Du lebst offensichtlich in C89. VLAs sind im C99-Standard dazugekommen. Also sind sie nicht ausschliesslich GCC-Feature. (In C11 sind sie de facto wieder rausgeflogen, aber damit sind sie immer noch Standard in C99.)
-
truuth schrieb:
Sone schrieb:
truuth schrieb:
Sone schrieb:
Wieso hat noch keiner gesagt, dass das VLAs ein GCC-Feature sind?
Weil die Aussage falsch ist?
Ach halt die Klappe...
Haste meine Editierung nicht gesehen oder hast du nur keine Ahnung?Du lebst offensichtlich in C89. VLAs sind im C99-Standard dazugekommen.
Schau mal hier, bei 8.3.4, direkt Klausel 1.
-
truuth schrieb:
Sone schrieb:
truuth schrieb:
Sone schrieb:
Wieso hat noch keiner gesagt, dass das VLAs ein GCC-Feature sind?
Weil die Aussage falsch ist?
Ach halt die Klappe...
Haste meine Editierung nicht gesehen oder hast du nur keine Ahnung?Du lebst offensichtlich in C89. VLAs sind im C99-Standard dazugekommen. Also sind sie nicht ausschliesslich GCC-Feature. (In C11 sind sie de facto wieder rausgeflogen, aber damit sind sie immer noch Standard in C99.)
Ich dachte, das wär hier das C++ Subforum. In C++ gibt es offiziell keine VLAs. Der GCC bietet das als Extension für C++ an. Aber dass sie in C11 "de facto wieder rausgeflogen" seien, ist mir neu. Interessant.

-
krümelkacker schrieb:
Aber dass sie in C11 "de facto wieder rausgeflogen" seien, ist mir neu. Interessant.

Habs mal für dich rausgekramt:
N1570 6.7.6.2 Klausel 4 schrieb:
Variable length arrays are a conditional feature that implementations need not support.
Wenn die Implementierung das Feature unterstützt, dann ist das folgende Makro definiert (als
1):__STDC_NO_VLA__
-
Yea schrieb:
Weil normale, micht mit new allozierte Speicherbereiche auf dem Stack angelegt werden, und zwar zu Compile-Zeit und nicht Laufzeit. Daher muss der Compiler vorher wissen, wie groß die einzelnen anzulegende Bereiche sein sollen -> konstanter Ausdruck, konstante und bekannte Größe.
Mit new allozierte Speicherbereiche werden auf dem Heap angelegt, zur Laufzeit. Daher interessiert es den Compiler zu Compile-Zeit nicht, wie groß dein Array ist.Ah ok,danke

-GhostfaceChilla-
-
Yea schrieb:
Weil normale, micht mit new allozierte Speicherbereiche auf dem Stack angelegt werden, und zwar zu Compile-Zeit und nicht Laufzeit. Daher muss der Compiler vorher wissen, wie groß die einzelnen anzulegende Bereiche sein sollen -> konstanter Ausdruck, konstante und bekannte Größe.
Mit new allozierte Speicherbereiche werden auf dem Heap angelegt, zur Laufzeit. Daher interessiert es den Compiler zu Compile-Zeit nicht, wie groß dein Array ist.Die Schlussfolgerung ist de facto aber falsch. Natürlich ist es auch möglich, den Stackzeiger mit erst zur Laufzeit bekannten Größen zu manipulieren. Es macht nicht mal nen Unterschied. Insofern ist eine technische Erklärung hier völlig fehl am Platz. Warum C++ sich dafür entschieden hat das nicht zu unterstützen, ist selbstverständlich am Typsystem festzumachen.
-
Artchi@logedOff schrieb:
Warum?
C++ != CSollte aber ein alter Hut sein, diese Information.

Ja, aber was haben sich die Leute, die den C++-Standard entwickeln, dabei gedacht? Es ist doch kaum Mehraufwand beim Compilerbau nicht-dynamische Arrays nicht-konstanter Größe zuzulassen. Und solange die Größe klein ist, wäre es sogar effizienter als einen std::vector bzw. ein new[]-Array zu erstellen.
Yea schrieb:
Weil normale, nicht mit new allozierte Speicherbereiche auf dem Stack angelegt werden, und zwar zu Compile-Zeit und nicht Laufzeit.
Das ist falsch oder du hast dich komisch ausgedrückt und meinst etwas anderes. Die nicht mit new allozierte Speicherbereiche werden doch erst zur Laufzeit auf den Stack gelegt und nicht schon vorher, denn es gibt ja sowas wie Rekursion. Es steht allerdings fest, um wie viel Bytes der Stackpointer verkleinert/vergrößert wird. Dieser Wert könnte aber (rein theoretisch) variabel sein. Allerdings kann man dann nicht beim Betreten einer Funktion wissen, um wie viel der Stack vergrößert wird, da dieser Wert erst berechnet werden muss.
-
Ramanujan schrieb:
Artchi@logedOff schrieb:
Warum?
C++ != CSollte aber ein alter Hut sein, diese Information.

Ja, aber was haben sich die Leute, die den C++-Standard entwickeln, dabei gedacht? Es ist doch kaum Mehraufwand beim Compilerbau nicht-dynamische Arrays nicht-konstanter Größe zuzulassen. Und solange die Größe klein ist, wäre es sogar effizienter als einen std::vector bzw. ein new[]-Array zu erstellen.
Letzteres stimmt, vorheriges ist Quatsch.
Ramanujan schrieb:
Yea schrieb:
Weil normale, nicht mit new allozierte Speicherbereiche auf dem Stack angelegt werden, und zwar zu Compile-Zeit und nicht Laufzeit.
Das ist falsch oder du hast dich komisch ausgedrückt und meinst etwas anderes. Die nicht mit new allozierte Speicherbereiche werden doch erst zur Laufzeit auf den Stack gelegt und nicht schon vorher, denn es gibt ja sowas wie Rekursion.
Ihr beide meint es wohl anders, denn deine Begründung ist ebenfalls Quatsch. Es gibt vor der "Laufzeit" oder der Ausführung der PE überhaupt keinen "Stack".
Ramanujan schrieb:
Dieser Wert könnte aber (rein theoretisch) variabel sein. Allerdings kann man dann nicht beim Betreten einer Funktion wissen, um wie viel der Stack vergrößert wird.
Soso, der Stack kann also vergrößert werden? Dann brauchen wir in C ja kein
mallocmehr,allocatuts schon