wake-up-neo.com

Warum brauche ich dynamische Speicherzuordnung, wenn ich nur ein Array erstellen kann?

Ich las über dynamische Speicherzuordnung und statische Speicherzuordnung und fand Folgendes über dynamische Speicherzuordnung:

In den in den vorangegangenen Kapiteln gezeigten Programmen wurden alle Speicheranforderungen vor der Programmausführung durch Definition der benötigten Variablen bestimmt. Es kann jedoch Fälle geben, in denen der Speicherbedarf eines Programms nur zur Laufzeit ermittelt werden kann. Beispielsweise hängt der benötigte Speicher von der Benutzereingabe ab.

Also habe ich folgendes Programm in C++ geschrieben:

#include <iostream>

int main()
{
  int n = 0;
  int i = 0;

  std::cout << "Enter size: ";
  std::cin >> n;
  int vector[n];

  for (i=0; i<n; i++)
  {
    vector[i] = i;
  }

  return 0;
}

Dieses Programm funktioniert ... Ich verstehe nicht, wie es funktioniert ... Wann wird die Größe hier bestimmt? Wie wird der Vektor in diesem Fall zugewiesen?

6
Vasi Marin

Nach dieses (Hervorhebung meines):

Automatische Arrays mit variabler Länge sind in ISO C99 und als .__ zulässig. Die Erweiterung GCC akzeptiert sie im C90-Modus und in C++. Diese Arrays sind Wie andere automatische Arrays deklariert, jedoch mit einer Länge von kein konstanter Ausdruck. Der Speicher wird an der Stelle von .__ zugewiesen. deklaration und freigegeben, wenn der Blockbereich, der die .__ enthält. Deklaration beendet.

Beachten Sie, dass dies nur eine Erweiterung ist und nicht für jeden Compiler geeignet ist. Beispielsweise funktioniert es nicht für mich in MSVC.

8
Blaze

Ein weiteres wichtiges von gcc docs:

Sie können die Funktion zuweisen, um einen Effekt ähnlich wie .__ zu erhalten. Arrays mit variabler Länge. Die Funktion Allocata ist in vielen anderen .__ verfügbar. C-Implementierungen (aber nicht in allen). Auf der anderen Seite variable Länge Arrays sind eleganter.

Es gibt andere Unterschiede zwischen diesen beiden Methoden. Speicherplatz zugewiesen mit Allocationa existiert, bis die enthaltende Funktion zurückkehrt Der Raum für ein Array mit variabler Länge wird freigegeben, sobald der Arrayname .__ ist. endet. (Wenn Sie sowohl Arrays mit variabler Länge als auch Allocationa in der Funktion __.. Verwenden, wird durch das Aufheben der Zuordnung eines Arrays mit variabler Länge auch __..

zuordnena - Speicherplatz zuweisen, der automatisch freigegeben wird. Das Allocationa () - Funktion weist Speicherplatzbytes im Stack-Frame .__ zu. des Anrufers. Dieser temporäre Speicherplatz wird automatisch freigegeben, wenn der Funktion, die aufrufende Aufladung () aufgerufen wird. Die Allocationa () Funktion ist maschinen- und compilerabhängig. Ganz bestimmt Anwendungen kann ihre Verwendung die Effizienz im Vergleich zur Verwendung von .__ verbessern. Malloc (3) plus frei (3).

Ich denke, für Ihre Frage gelten die gleichen Aussagen wie für Allocation:

Es gibt keine Fehleranzeige, wenn der Stack-Frame nicht erweitert werden kann . (Nach einer fehlgeschlagenen Zuordnung empfängt das Programm jedoch wahrscheinlich ein SIGSEGV-Signal .__, wenn es versucht, auf den nicht zugewiesenen Speicherplatz zuzugreifen.)

die Verwendung dynamischer Speicherzuordnung ist sicherer als Arrays mit variabler Länge.

0
Dmytro Dadyka