C++ Feldlänge begrenzt?
-
Hallo,
Ich verwende zum Programmieren das MinGW in der Eclipse umgebung.
Wenn ich folgendes mache:
int laenge = 100000; int Feld[laenge];Können diese Befehle erfolgreich ausgeführt werden.
Wenn ich die Variable laenge aber auf 1000000 (also eine null mehr) festlege, schmiert das programm beim ausführen von int Feld[laenge] einfach ab. Auch beim Debuggen in Eclipse erhalte ich keine exception sondern nur die meldung "No source available for "__chkstk_ms() at 0x401d4b" ".Hat jemand eine idee woran das liegen könnte?
-
Stacksegment ist per Deafult auf 1M begrenzt.
-
Ok cool. Danke für die fixe antwort. Wie kann ich das ändern?
-
wenn "int Feld[laenge];" eine lokale Variable in einer Funktion ist, dann wird sie auf dem Stack angelegt. der Stack ist aber oft begrenzt, z. B. auf 64 KB (oder so). wenn du noch ein "static" davorschreibst, ist die Variable global/static, kann dadurch größer werden, ist aber bei allen Funktionsaufrufen immer gleich
-
Du hast wie volkard schon sagt keinen Platz mehr auf dem Stack. Solche zur Compilezeit feststehenden großen Arrays legen aber einen Denkfehler nahe.
Denn entweder wird soviel Platz zur Laufzeit gebraucht, dann ist das völlig ok. Aber wenn du soviel Platz schon von vornerein brauchst, dann sieht das in meinen Augen so aus, als ob du einen Puffer anlegen willst für etwas, was der Benutzer eingibt, du jedoch keine Ahnung hast wie man es dynamisch anlegt...
Zur Testzwecken kann man das natürlich gerne machen. Auch um mal zu sehen wie verschiedene Compiler oder Betriebssysteme damit umgehen
-
volkard schrieb:
Stacksegment ist per Deafult auf 1M begrenzt.
In Windows [/klugscheiß]. Außerdem ist es irgendwie änderbar (aber keine Ahnung, wie das in Windows konkret geht). Wenn du bei Google mal danach suchst, wie man die Stackgröße ändern kann, soltlest du fündig werden. Lies dir aber erst noch durch, was ich sonst noch zu sagen habe:
Als Richtschnur: So große Objekte kann man auch ohne nennenswerte Nachteile dynamisch anlegen (hier z.B. std::vector), da die kleinen Laufzeitnachteile durch dynamische Speicherverwaltung bei solch großen Objekten nur einen winzig kleinen Teil der Gesamtlaufzeit ausmachen werden und man diese Objekte sicherlich auch nicht sehr oft neu anlegen und zerstören wird.
Dein Beispiel sollte übrigens in C++ nicht funktionieren. Das ist ein (berüchtigtes) C99-Feature, dass man Arrays mit nicht-statischer Größe erzeugen kann (sogenannte VLAs, variable length array). Manche Compiler bieten dies als Zusatzfeature für C++ an, obwohl man es gerade in C++ eigentlich gar nicht bräuchte (weil es eben std::vector und ähnliches gibt).