C-Programmierung

Dynamische Speicherallozierung

Zeiger-Array Dualismus | | Unterschiede von C++ und Java

Arrays haben immer eine konstante Größe:

z.B.

int a[10];

Das geht nicht:

int a[n];

Anmerkung: Arrays mit nicht-konstanter initialer Größe sind nicht Teil des C-Standards bis einschließlich C90. Modernere Standards wie C99 oder C11 unterstützen es, aber die Größe ist auf die maximale Größe des Stacks, dem Speicherbereich für lokale Variablen, beschränkt. Meistens ist der Stack nur einige wenige Megabyte groß - int a[4000000] wäre dafür schon zu groß und produziert einen sog. segmentation fault.

Für Arrays mit beliebiger nicht-konstanter Länge benutzt man Zeiger:

int *a = new int[n];

Dies nennt man dynamische Speicherallozierung mit Hilfe von new: die new-Funktion liefert einen Zeiger auf einen neuen Speicherbereich einer bestimmten Größe. Diese Größe darf nun zur Laufzeit beliebig gewählt werden, daher nennt man dies auch dynamische Allozierung.

Anmerkung: n ist hier prinzipiell unbeschränkt, da der Speicher auf dem sog. Heap alloziert wird. Dessen Größe ist nur von der MMU (Memory Management Unit) bechränkt und kann u.U. sogar größer als der reine phyisikalische RAM Speicher sein.

Vorsicht: Nur die initiale Größe kann bei der Allozierung veränderlich sein, die Größe eines einmal allozierten Speicherblocks bleibt danach trotzdem gleich. Das Array selber ist daher nicht veränderlich. D.h. wenn man ein größeres Array benötigt, so alloziert man ein größeres Array:

int *b = new int[n+1];

Wegen Zeiger-Array Dualismus erfolgt ein Zugriff entweder mit

int x = *(a+index);

oder mit

int x = a[index];

Nicht vergessen, den alten Speicher nach Benutzung wieder freizugeben! Sonst produziert man ein fantastisches Speicherleck:

delete a;


Zeiger-Array Dualismus | | Unterschiede von C++ und Java

Options: