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.

  • ๐Ÿง  Laufzeitzuweisung: malloc() reserviert Speicher wรคhrend der Ausfรผhrung, wenn die benรถtigte GrรถรŸe zur Kompilierzeit nicht bekannt ist.
  • ๐Ÿ“ฆ Syntax: Ein cast_type-Zeiger empfรคngt malloc(byte_size), wobei die GrรถรŸe รผblicherweise mit sizeof fรผr die Portabilitรคt festgelegt wird.
  • โš ๏ธ NULL-Prรผfung: Bei einer fehlgeschlagenen Anfrage wird ein NULL-Zeiger zurรผckgegeben. รœberprรผfen Sie daher das Ergebnis, bevor Sie darauf zugreifen.
  • โž• Zeigerarithmetik: Der Block ist zusammenhรคngend, daher verwenden Sie + statt ++, um auf die Array-Elemente zuzugreifen.
  • รฐลธยงยน Speicher freigeben: Um Speicherlecks und hรคngende Zeiger zu vermeiden, sollte jeder Speicherblock mit free() freigegeben werden.
  • ๐Ÿค– KI-Unterstรผtzung: KI-Assistenten und GitHub Copilot entwerfen malloc()-Aufrufe und kennzeichnen fehlende free()-Anweisungen.

malloc()-Funktion in C

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.

Was ist Malloc in C?

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.

Hรคufig gestellte Fragen

In C ist die Typumwandlung optional und oft nicht empfehlenswert, da void* automatisch in jeden Objektzeiger konvertiert wird und eine explizite Typumwandlung eine fehlende Einbindung von stdlib.h verschleiern kann. C++Allerdings wird die Besetzung benรถtigt.

Ein Rรผckgabewert von NULL bedeutet, dass die Anfrage fehlgeschlagen ist, รผblicherweise aufgrund von Speichermangel. รœberprรผfen Sie den Zeiger immer, bevor Sie ihn verwenden, da das Dereferenzieren von NULL zu undefiniertem Verhalten fรผhrt und in der Regel einen Programmabsturz verursacht.

realloc() รคndert die GrรถรŸe eines zuvor mit malloc() reservierten Speicherblocks.ping Die vorhandenen Daten werden bis zur kleineren GrรถรŸe gespeichert. Schlรคgt dies fehl, wird NULL zurรผckgegeben und der ursprรผngliche Datenblock bleibt unverรคndert. Daher sollte das Ergebnis zunรคchst einem temporรคren Zeiger zugewiesen werden.

Ein Speicherleck entsteht, wenn der durch malloc() erzeugte Heap-Speicher nicht mit free() freigegeben wird. Das Programm reserviert weiterhin Speicherplatz, den es nicht mehr benรถtigt, wodurch der verfรผgbare Speicher allmรคhlich erschรถpft wird.

malloc() reserviert Speicher auf dem Heap, nicht auf dem Stack. Heap-Blรถcke bleiben gรผltig, bis free() aufgerufen wird; sie kรถnnen also die Funktion รผberdauern, die sie erzeugt hat, im Gegensatz zu automatischen Stack-Variablen, die nach der Rรผckgabe verschwinden.

malloc() ist eine Bibliotheksfunktion, die void* zurรผckgibt und sizeof benรถtigt, um Bytes zu berechnen. C++ Der Operator `new` gibt einen typisierten Zeiger zurรผck und ruft Konstruktoren auf. Verwenden Sie `malloc()` zusammen mit `free()` und `new` zusammen mit `delete`.

Ja. KI-Programmierassistenten entwerfen malloc()-Aufrufe, fรผgen NULL-Prรผfungen ein und markieren fehlende free()-Aufrufe oder Speicherlecks. AuรŸerdem kรถnnen sie Zeigerarithmetik erklรคren. Kompilieren und testen Sie den generierten Code immer, bevor Sie ihm vertrauen.

GitHub-Copilot schlรคgt malloc(), sizeof() und passende free()-Zeilen aus einem Kommentar vor, der Ihre Absicht beschreibt. RevPrรผfen Sie vor dem Kompilieren jeden Vorschlag auf fehlende NULL-Prรผfungen und Speicherlecks.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: