malloc() Funktion in der C-Bibliothek mit BEISPIEL
โก Intelligente Zusammenfassung
malloc() in C reserviert zur Laufzeit einen Speicherblock auf dem Heap und gibt einen void-Zeiger auf dessen erstes Byte zurรผck, sodass Programme Speicher anfordern kรถnnen, dessen Grรถรe erst bei der tatsรคchlichen Ausfรผhrung des Codes bekannt wird.

Was ist malloc in C?
Die Funktion malloc() steht fรผr die Speicherzuweisung. Es handelt sich um eine Funktion, die zur dynamischen Zuweisung eines Speicherblocks verwendet wird. Es reserviert Speicherplatz der angegebenen Grรถรe und gibt den Nullzeiger zurรผck, der auf den Speicherort zeigt. Der zurรผckgegebene Zeiger ist normalerweise vom Typ void. Das bedeutet, dass wir jedem Zeiger eine Malloc-Funktion zuweisen kรถnnen.
Syntax
ptr = (cast_type *) malloc (byte_size);
Dabei steht:
- ptr ist ein Zeiger auf cast_type.
- Die malloc-Funktion gibt einen Zeiger auf den zugewiesenen Speicher von byte_size zurรผck.
Example: ptr = (int *) malloc (50)
Bei erfolgreicher Ausfรผhrung dieser Anweisung wird ein Speicherplatz von 50 Byte reserviert. Die Adresse des ersten Bytes des reservierten Speicherplatzes wird dem Zeiger ptr vom Typ int zugewiesen.
Betrachten Sie ein weiteres Beispiel einer Malloc-Implementierung:
#include <stdlib.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */ if (ptr != NULL) { *(ptr + 5) = 480; /* assign 480 to sixth integer */ printf("Value of the 6th integer is %d",*(ptr + 5)); } }
Ausgang:
Value of the 6th integer is 480
Beachten Sie, dass sizeof(*ptr) anstelle von sizeof(int) verwendet wurde, um den Code robuster zu gestalten, falls die *ptr-Deklaration spรคter in einen anderen Datentyp umgewandelt wird.
Die Zuweisung kann fehlschlagen, wenn der Speicher nicht ausreicht. In diesem Fall wird ein NULL-Zeiger zurรผckgegeben. Daher sollten Sie Code einschlieรen, um nach einem NULL-Zeiger zu suchen.
Beachten Sie, dass der zugewiesene Speicher zusammenhรคngend ist und als Array behandelt werden kann. Wir kรถnnen verwenden Zeiger Um auf die Array-Elemente zuzugreifen, verwenden Sie arithmetische Operationen anstelle von eckigen Klammern [ ]. Wir empfehlen, + zu verwenden, um auf Array-Elemente zu verweisen, da die Inkrementierung ++ oder += die vom Zeiger gespeicherte Adresse รคndert.
Die Malloc-Funktion kann auch mit dem Zeichendatentyp sowie komplexen Datentypen wie Strukturen verwendet werden.
Warum sollte man malloc() in C verwenden?
Statische Arrays und gewรถhnliche Variablen legen ihre Grรถรe beim Kompilieren des Programms fest. Das fรผhrt zu Speicherplatzverschwendung, wenn der Bedarf geringer ist, und zu einem Fehler, wenn er grรถรer ist. `malloc()` lรถst dieses Problem, indem es Speicher zur Laufzeit anfordert. So kann ein Programm einen Puffer exakt an die empfangene Datenmenge anpassen. Diese Flexibilitรคt zur Laufzeit ist der Kern von dynamische Speicherzuordnung in C.
Die dynamische Speicherverwaltung mit malloc() ist in vielen gรคngigen Situationen die richtige Wahl:
- Der Umfang der Eingabe ist erst nach dem Programmstart bekannt, beispielsweise beim Einlesen einer Datei oder einer vom Benutzer bereitgestellten Liste.
- Es werden groรe Blรถcke benรถtigt, die den begrenzten Stack รผberlaufen lassen wรผrden, da malloc() vom viel grรถรeren Heap liest.
- Daten mรผssen die Funktion รผberdauern, die sie erzeugt hat, da der Heap-Speicher so lange bestehen bleibt, bis er explizit freigegeben wird.
- Strukturen und Arrays mรผssen wรคhrend der Programmausfรผhrung vergrรถรert oder verkleinert werden.
Da der reservierte Block als Zeiger zurรผckgegeben wird, kann er kostengรผnstig zwischen Funktionen weitergegeben werden, ohne die zugrunde liegenden Daten zu kopieren.
Wie man von malloc() reservierten Speicher freigibt
Der von `malloc()` reservierte Speicher liegt im Heap und wird nicht automatisch freigegeben. Wenn ein Programm stรคndig Speicher allokiert, ohne ihn freizugeben, verbraucht es nach und nach den gesamten verfรผgbaren Speicher โ ein Fehler, der als Speicherleck bekannt ist. Die Funktion `free()` gibt einen freigegebenen Speicherblock an das System zurรผck, sodass der Speicherplatz wiederverwendet werden kann.
Die Funktion free() nimmt ein einzelnes Argument entgegen, den von malloc() zurรผckgegebenen Zeiger, und gibt den gesamten Speicherblock auf einmal frei:
int *ptr; ptr = malloc(10 * sizeof(int)); if (ptr != NULL) { /* use the allocated memory here */ free(ptr); /* release the block */ ptr = NULL; /* avoid a dangling pointer */ }
Befolgen Sie diese Regeln, um dynamischen Speicher sicher zu verwalten:
- Rufen Sie free() genau einmal fรผr jede erfolgreiche malloc()-Aufrufe auf; das zweimalige Freigeben desselben Speicherblocks fรผhrt zu undefiniertem Verhalten.
- Setzen Sie den Zeiger nach der Freigabe auf NULL, damit er nicht als hรคngender Zeiger wiederverwendet werden kann.
- Verwenden Sie niemals free() fรผr einen Zeiger, den malloc() nicht zurรผckgegeben hat, einschlieรlich eines Zeigers, der durch Zeigerarithmetik verschoben wurde.
- Jede Speicherbelegung muss mit einer entsprechenden Freigabe abgeglichen werden, bevor der Zeiger seinen Gรผltigkeitsbereich verlรคsst.
Keeping Das ausgewogene Zuweisen und Freigeben von Speicher ist die Kerndisziplin der manuellen Speicherverwaltung in C und verhindert sowohl Speicherlecks als auch Abstรผrze, die durch die Wiederverwendung freigegebenen Speichers verursacht werden.
malloc() vs calloc(): Wichtigste Unterschiede
malloc() und calloc() Beide Funktionen reservieren Heap-Speicher, unterscheiden sich aber in ihren Argumenten und in der Behandlung des neu reservierten Speicherblocks. `malloc()` benรถtigt ein Argument, die Gesamtanzahl der Bytes, und initialisiert den Block nicht, sodass er unvorhersehbare Werte enthรคlt, bis das Programm darauf schreibt. `calloc()` hingegen benรถtigt zwei Argumente, die Anzahl der Elemente und deren Grรถรe, und รผberschreibt alle Bytes mit Nullen, bevor der Zeiger zurรผckgegeben wird.
Die praktischen Unterschiede lassen sich auf drei Punkte reduzieren:
- Initialisierung: calloc() setzt den Speicher auf Null, malloc() hingegen nicht, was malloc() etwas schneller macht, wenn die Werte ohnehin รผberschrieben werden.
- Argumente: Man schreibt malloc(n * size), aber calloc(n, size), um dasselbe Array zu reservieren.
- Anwendungsfall: Wรคhlen Sie calloc(), wenn ein sauberer, mit Nullen initialisierter Block wichtig ist, und malloc(), wenn Geschwindigkeit im Vordergrund steht und die Initialisierung manuell erfolgt.
Beide Funktionen sind in stdlib.h deklariert, beide geben im Fehlerfall einen void-Zeiger oder NULL zurรผck und beide geben ihren Speicher mit der gleichen free()-Funktion zurรผck.

