variable Array-Größen



  • Hallo an alle Forenleser!
    Ich habe erst vor kurzer Zeit angefangen, C++ zu lernen, und arbeite mich zur Zeit durch diverse Tutorials durch.
    Dabei bin ich über eine Sache gestolptert:

    man kann angeblich Arrays mit einer erst zur Laufzeit bekannten Größe nur durch dynamische Speicherreservierung erstellen.
    in dem Beispiel aus diesem Tutorial wird das array durch

    int* p;
    p= new int[i];
    

    erstellt.

    Wenn ich jedoch den Code so verändere, dass das Array einfach durch

    int array[i];
    

    erstellt wird, erhalte keinen fehler und das programm läuft einwandfrei

    Warum sollte man also die kompliziertere Methode verwenden?

    (Ich benutze die neuste Version des GCC c++ compilers)



  • @Eradest
    Du stützt dich hier auf eine Erweiterung des Gnu-Compilers. Variable-Length-Arrays sind ein C99-Feature. Sie gehören aber nicht zu Standard-C++. Wenn du also Standard-C++ schreiben willst, wirst du auf sie verzichten und new (oder besser: std::vector) einsetzen müssen.



  • Hierzu noch eine Frage.
    Wo wird denn das VLA eigentlich angelegt. Schätze mal auf den Stack.
    Dann wären diese Dinger aber ganz böse und echte Stackbrecher oder?



  • Naja, der Stack ist ja nu nich SO klein, von daher sollte es keine Probleme geben, wenn du nicht grade ein ueberdimensioniertes Array auf dem Stack anlegen willst. Und in so einem Fall waere es dann egal ob es VLA oder standard array ist.
    Ich vermute mal, dass der Compiler irgendwo auf dem Stack abspeichert, wie lang das VLA denn nu ist, so dass da nicht uebermaessig viel Speicher verloren geht. Soweit ich das verstnaden hab heisst VLA ja auch nicht, dass man die Laenge des Arrays zur Laufzeit veraendert, sondern erst zur Laufzeit festlegt, wie lang das Array bei Initialisierung sein soll.



  • Also ich befürchte schon, dass VLAs riskanter sind als "normale Arrays":
    - Lt Standard kann bereits der Compiler feststellen, wie viel Platz maximal auf dem Stack benötigt werden wird und
    - eine konstante Größenangabe macht man nicht so leicht falsch wie eine zur Laufzeit bestimmte.

    Das soll jetzt nicht bedeuten, dass VLAs eine schlechte Sache seien, nur würde ich eben schon vermuten, dass man dort durchaus öfter (als bei fixed length arrays) mal Probleme mit der Stackgröße bekommt.

    Gruß,

    Simon2.


Anmelden zum Antworten