Variable Sized Arrays vs calloc in C
Auf die Diskussion des dynamischen Arbeitsspeichers, hier: "Einführung in C Pointer und Dynamischer Speicher"
Der Autor fest:
Einen Speicherblock wie diese können effektiv verwendet werden, als eine mehr flexible array. Dieser Ansatz ist tatsächlich viel häufiger in der realen Welt von C-Programmen. Es ist auch vorhersehbarer und flexibler als ein "variable-size array"
Den Typ von Speicherblock wird er reden, ist wie folgt:
const int size = 5;
int * array = calloc(size, sizeof(int));
und dann mit einem anderen Zeiger zum iterieren über das array:
int * index = array;
for (i = 0; i < size; i++) {
*index = 1; //or whatever value
index++;
}
Meine Frage ist, wie ist diese Methode besser als ein standard-variable-size array wie dieses?:
int array[variable];
oder dynamisch:
char name[] = "Nick";
Der Autor nicht wirklich viel vergossen Licht auf, warum sollte ich bevorzuge die erstere Methode, um die letzteren. Oder genauer gesagt: Wie ist es mehr "berechenbare und flexible"?
- Mögliche Duplikate von malloced array VS. variable-Länge-array
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie erklären
int array[variable]
sich der Speicher auf dem Stapel reserviert, die nicht sehr gut für große, relativ permanente Daten-Strukturen (wie Sie Sie zurückgeben möchten). Sie nicht brauchen, um Speicher frei manuell, wenn Sie die array-syntax, da es befreit, wenn es den Bereich verlässt.calloc
auf der anderen Seite wird Speicher dynamisch zur Laufzeit auf dem heap. Sie müssen frei von sich selbst, sobald Sie fertig sind mit ihm.Ich Stimme mit ocdecio, dass c89 nicht erlaubt
c99, können einige Typen von Variablen und Ausdrücken werden die array-Größe. Aber zusätzlich zu, dass, Dinge, die zugewiesen mit
malloc
und Familie kann in der Größe verändert werden mitrealloc
.Mit variable-sized-arrays auf dem stack, als eine auto-variable (statt dem heap mit calloc/malloc/new/etc.) ist keine schlechte Idee für einen Prozess, der ausgeführt wird, für eine lange Zeit und müssen und zerstören viele kleine arrays. Dies ist, weil der stack ist garantiert nicht immer fragmentiert, während der Speicher kann und wird fragmentiert erhalten. Wenn Sie schreiben, die firmware oder ein Dienst, der laufen muss, für Jahre, ohne zu stoppen, sind Sie fast verboten von der Verwendung von malloc oder new.
Variable-Länge-automatische arrays dürfen in ISO-C99, und als eine Erweiterung GCC akzeptiert Sie in der C90-Modus und in C++.
Also, don ' T foget zu setzen, compiler-flag -std=c99 oder -std=gnu99. Folgendes Beispiel funktioniert die
Ich garantieren, dass 🙂
Weil
ist nicht gültig in standard-C -- man kann Sie nur definieren Sie die Länge eines Arrays mit einer Konstanten. (wie Ihr
Beispiel, die nicht-variable-Länge).
Als solche, ist es notwendig, einen Speicher-Zuweisung wie calloc (), wenn Sie möchten, erstellen Sie ein array mit einer Länge basiert auf einem Programm-variable.
Nur vergessen Sie nicht, free() es.