Zur Diskussion des dynamischen Gedächtnisses hier: "Einführung in C-Zeiger und dynamisches Gedächtnis"
Der Autor sagt:
Ein Speicherblock wie dieser kann effektiv als flexibleres Array verwendet werden. Dieser Ansatz ist in realen C-Programmen tatsächlich viel häufiger. Es ist auch berechenbarer und flexibler als ein "Array variabler Größe"
Der Typ des Speicherblocks, über den er spricht, ist so:
%Vor%und dann einen anderen Zeiger verwenden, um über das Array zu iterieren:
%Vor%Meine Frage ist, wie ist diese Methode besser als ein Standard-Array variabler Größe wie diese?:
%Vor%oder dynamisch:
%Vor%Der Autor wirft nicht wirklich Licht in die Frage, warum ich die frühere Methode der letzteren vorziehen sollte. Oder genauer: Wie ist es "berechenbarer und flexibler"?
Wenn Sie int array[variable]
deklarieren, wird der Speicher auf dem Stack zugewiesen, was für große, relativ dauerhafte Datenstrukturen (wie eine, die Sie vielleicht zurückgeben möchten) nicht sehr gut ist. Sie müssen den Speicher nicht manuell freigeben, wenn Sie die Array-Syntax verwenden, da sie freigegeben wird, wenn sie den Gültigkeitsbereich verlässt. calloc
dagegen reserviert Speicher dynamisch zur Laufzeit auf dem Heap. Sie müssen es selbst befreien, sobald Sie damit fertig sind.
Ich stimme mit ocdecio überein, dass gekennzeichnete Fragen c89 nicht zulässt
%Vor% c99 markiert einige Arten von Variablen und Ausdrücken als Array-Größe . Darüber hinaus können Dinge, die mit malloc
und family zugewiesen wurden, mit realloc
angepasst werden.
Das Verwenden von Arrays variabler Größe auf dem Stack als eine automatische Variable (anstelle des Heaps, der Calloc / malloc / new / etc verwendet) ist keine schlechte Idee für einen Prozess, der für eine lange Zeit ausgeführt wird und ausgeführt werden muss und zerstöre viele kleine Arrays. Dies liegt daran, dass der Stapel garantiert niemals fragmentiert wird, während Speicher fragmentiert werden kann und wird. Wenn Sie Firmware oder einen Dienst schreiben, der jahrelang ohne Unterbrechung ausgeführt werden muss, ist es fast verboten, malloc oder new zu verwenden.
Weil
%Vor%ist in Standard C nicht gültig - Sie können nur die Länge eines Arrays mit einer Konstante definieren. (wie dein
%Vor%Beispiel, das nicht von variabler Länge ist.
Daher ist es erforderlich, einen Speicherzuordner wie calloc () zu verwenden, wenn Sie ein Array mit einer Länge auf Basis einer Programmvariablen erstellen möchten.
Vergiss einfach nicht, () es zu befreien.