Variable Größe Arrays vs Calloc in C

7

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"?

    
nmiller 15.01.2009, 23:00
quelle

5 Antworten

10

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.

    
Mehrdad Afshari 15.01.2009, 23:04
quelle
8

Ich stimme mit ocdecio überein, dass nicht zulässt

%Vor%

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.

    
Evan Teran 15.01.2009 23:04
quelle
3

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.

    
Mark Lakata 25.07.2011 22:42
quelle
2

Automatische Arrays variabler Länge sind in ISO C99 erlaubt, und als Erweiterung akzeptiert GCC sie im C90-Modus und in C ++. Also, foget nicht setzen Compiler-Flag -std = c99 oder -std = gnu99. Folgendes Beispiel wird funktionieren

%Vor%

Ich garantiere das: -)

    
sakhabyn 20.01.2017 18:20
quelle
0

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.

    
HanClinto 15.01.2009 23:04
quelle

Tags und Links