14.2 Speicherallokation mit »malloc()« 

Ich habe bereits kurz erwähnt, mit welcher Funktion Speicher dynamisch reserviert werden kann. Es wird dabei auch von einer Speicherallokation (allocate, dt. zuweisen) gesprochen. Die Syntax dieser Funktion sieht so aus:
#include <stdlib.h> void *malloc(size_t size);
Bei erfolgreichem Aufruf liefert die Funktion malloc() die Anfangsadresse mit der Größe size Bytes vom Heap zurück. Da die Funktion einen void-Zeiger zurückliefert, hängt diese nicht von einem Datentyp ab. Hierzu ein Beispiel:
/* malloc1.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int *p; p = malloc(sizeof(int)); if(p != NULL) { *p=99; printf("Allokationerfolgreich ... \n"); } else { printf("Kein virtueller RAM mehr verfügbar ...\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
Nach der Deklaration eines int-Zeigers wurde diesem mit
p = malloc(sizeof(int));
eine Anfangsadresse eines Speicherbereichs der Größe int zugewiesen. Bei Erfolg zeigt der Zeiger p auf den Anfang des reservierten Speicherbereichs. Ist dabei etwas schiefgegangen, zeigt der Zeiger auf NULL, und es wird ausgegeben, dass kein Speicherplatz reserviert werden konnte. Abbildung 14.1 verdeutlicht den Programmablauf anhand einer Grafik.
Hinweis |
Ein Type-Casting der Funktion malloc() ist in C nicht notwendig. ANSI C++ schreibt allerdings ein Casten des Typs void * vor (im Beispiel wäre dies C++-konform: p=(int *) malloc(sizeof(int));). Falls Sie also eine Fehlermeldung wie 'void *' kann nicht in 'int *' konvertiert werden erhalten, dann haben Sie einen C++-Compiler vor sich bzw. einen Compiler, der im C++-Modus läuft. Häufig ist es aber problemlos möglich, den Compiler im C-Modus zu betreiben. Bei Visual C++ (hier beispielsweise die Version 2008) z. B. brauchen Sie nur die Eigenschaftsseite mit |
Abbildung 14.1 Dynamisch reservierter Speicher vom Heap
Na gut, ich denke, das beeindruckt Sie nicht besonders. Zur Laufzeit eines Programms Speicherplatz für einen int-Wert reservieren mit solch einem Aufwand? Gut, dann reservieren Sie eben mehr Speicherplatz für mehrere int-Werte:
p = malloc(2 * sizeof(int));
Hiermit reservieren Sie Speicherplatz für zwei int-Werte vom Heap. Hier sehen Sie das Beispiel als Listing:
/* malloc2.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int *p = malloc(2 * sizeof(int)); if(p != NULL) { *p=99; /* alternativ auch p[0] = 99 */ *(p+1) = 100; /* alternativ auch p[1] = 100 */ printf("Allokation erfolgreich ... \n"); } else { printf("Kein virtueller RAM mehr verfügbar ...\n"); return EXIT_FAILURE; } printf("%d %d\n", p[0], p[1]); /* Sie können die Werte auch so ausgeben lassen. */ printf("%d %d\n", *p, *(p+1)); return EXIT_SUCCESS; }
Abbildung 14.2 soll den Sachverhalt veranschaulichen.
Abbildung 14.2 Speicher für mehrere Elemente dynamisch anfordern
Der Sachverhalt, warum *p und p[0] oder *(p+1) und p[1] auf dasselbe Element zugreifen, wurde in Kapitel 12, »Zeiger (Pointer)«, geklärt. Blättern Sie notfalls einfach zu den Tabellen am Ende von Kapitel 12 zurück.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.