2017-11-08 3 views
0

Ich verstehe das Grundkonzept von statischen Arrays und dynamischen Arrays. Der Hauptunterschied zwischen diesen beiden ist einer (Statisches Array) weist Speicher zur Kompilierungszeit und der andere zur Laufzeit zu. Wir können jedoch ein statisches Array erstellen, dessen Größe der vom Benutzer eingegebene Wert wäre.Dynamische Arrays und statische Arrays Kompilierzeit oder Laufzeit?

int value ; 
cin >> value ; 

int array [value] ; 
int i = 0 ; 
while(i < value) 
{ 
    cin >> array[i] ; 
    i ++ ; 
} 

Also das Programm kennt nicht die Größe dieses Arrays, bis zur Laufzeit. Also Was ist der eigentliche grundlegende Unterschied zwischen statischen und dynamischen Arrays dann, wenn statische Array kann auch gemacht werden, um Speicherplatz auf der Laufzeit zuzuordnen?

Auch sprechen über die Resizability des Arrays. Um ein dynamisches Array zu erweitern, können wir das vorherige Array nach dem Kopieren seiner Elemente in ein neues dynamisches Array doppelter Größe löschen. Wir können das Gleiche mit statischen Arrays tun, oder? [Das ursprüngliche Array kann in diesem Fall jedoch nicht gelöscht werden und verwendet redundanten Stapelspeicherplatz. Ist dies der einzige Unterschied zwischen S.Array und D.Array dann]

+0

"Raw" -Arrays sind niemals dynamisch (sie ändern ihre Größe nicht), können aber dynamisch zugewiesen werden. 'std :: vector' ist dynamisch (kann zur Laufzeit die Größe ändern) und sollte in diesem Fall verwendet werden. – crashmstr

+1

VLA ist nicht Standard C++. es ist eine Erweiterung. – Jarod42

+0

_allokiert den Speicher zur Kompilierzeit_ nein, das ist nicht möglich. –

Antwort

0

Es gibt Compiler-Erweiterungen namens "Variable Length Array" als Teil C99 Standards, die diese Erklärung ermöglicht.

Der C99-Standard wird nicht offiziell als Teil von C++ - Sprache unterstützt.

Der obige Code wird in MSVS (Microsoft Visual Studio) nicht funktionieren, da es nicht C99 nicht unterstützt, sondern durch gcc und clang werden

0

Statische Arrays erhalten gespeichert auf dem Stapel erfolgreich kompiliert, aber dynamische Arrays sind auf dem Heap gespeichert. Wenn etwas auf dem Stapel gespeichert ist, wird es in dem Moment, in dem es außer Reichweite ist, entsorgt. Beispiele sind Ints, Zeichen usw. Wenn Sie jedoch auf dem Heap erstellt werden, müssen Sie sicherstellen, dass die Garbage-Collection ihre Aufgabe erfüllt, wenn sie den Gültigkeitsbereich verlässt. Wenn Sie Speicher nicht ordnungsgemäß bereinigen und nicht freigeben, können Speicherlecks auftreten.