Um sicherzustellen, dass für eine Anwendung genügend Speicher zum Abspeichern von Daten zur Verfügung steht, ist es schlau, einen gewissen Speicherbereich zu reservieren. Dabei hilft uns in C das Schlüsselwort malloc (engl. memory allocation). Das folgende Beispiel macht die Verwendung von malloc deutlich:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> #include <stdlib.h> /* Für malloc und free */ int main(int argc, char *argv[]) { long double* ptr; ptr = NULL; ptr = (long double*)malloc(sizeof(long double)); printf("Adr. %u \n",ptr); /* Adresse: 3420832 */ printf("Adr. %u \n",ptr+1); /* Adresse: 3420840 */ free(ptr); return 0; } |
01: Einbindung der Standard Ein-/Ausgabe (stdio.h), damit das Schlüsselwort NULL verwendet werden kann.
02: Einbindung der Standard-Bibliothek (stdlib.h), damit malloc und free verwendet werden können.
06: Deklaration eines Pointers, der auf den Datentyp long double (8 Byte groß) zeigt.
07: Der Pointer ptr wird mit dem Schlüsselwort NULL initialisiert. Er zeigt also auf keinen Speicherbereich.
08: Die Funktion malloc reserviert mit sizeof einen Speicherplatz, der so groß ist, dass der Datentyp long double (8 Byte) hinein passt. Danach liefert malloc die Adresse dieser reservierten Speicherzelle als Integer-Wert zurück. Weil unser Pointer ptr aber vom Typ long double* (und nicht Integer) ist, muss die Rückgabe von malloc noch mit (long double*) gecastet werden, da sonst eine Warnung ausgegeben wird.
10: Die Adresse der Speicherzelle von ptr erhalten wir durch die Ausgabe von ptr als vorzeichenlose Ganzzahl (%u). Ein beispielhafter Wert für eine solche Adresse ist 3420832 (von Programmaufruf zu Programmaufruf unterschiedlich).
11: ptr wird um eins erhöht. Dadurch erhalten wir die Adresse der Speicherzelle nach ptr. Der Wert dieser nachfolgenden Speicherzelle ist nicht 3420831 (wie vielleicht vermutet), sondern 3420840. Also gleich 8 Zahlen höher, da ptr auf einen Bereich von 8 Byte (long double) zeigt.
13: Mit free(ptr) wird der von ptr reservierte Speicherbereich wieder frei gegeben.
Hinweis: Eine Pointervariable ist eine Variable, deren Wert eine Adresse ist.