Malloc und Free
Diese Funktionen ermöglichen es, neue Objekte nicht während der Kompilierung, sondern während der Programmausführung zu erstellen, wodurch die Nutzung von dynamischer Speicherzuweisung möglich wird.
malloc()
Bisher wurde Speicher für Daten einfach durch Deklaration reserviert:
int x;
Nun kann mit der Funktion malloc() Speicher dynamisch zugewiesen werden:
int* pX = (int*)malloc(4);
Die Funktion malloc() erwartet als Argument die Anzahl der zu reservierenden Bytes. Ist die benötigte Byteanzahl nicht bekannt, aber der Datentyp, kann der Ausdruck wie folgt angepasst werden:
int* pX = (int*)malloc(sizeof(int));
Wie geht es weiter?
Beachte, dass das Ergebnis der Funktion malloc() einem Zeiger zugewiesen wird. Das bedeutet, malloc() gibt eine Adresse zurück!
Das Präfix (int*) ist ein expliziter Cast. Der gewünschte Typ wird manuell angegeben. Zum Beispiel:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Hinweis
Die Header-Datei
stdlib.hmuss eingebunden werden. Sie enthält die Deklaration der Funktionmalloc().
Um Daten an der von der Funktion malloc() bereitgestellten Adresse zu speichern, wird der Dereferenzierungsoperator verwendet.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
Ist es möglich, Speicher freizugeben? – Ja, aber nur den Speicher, der durch malloc() und ähnliche Funktionen reserviert wurde.
free()
Diese Funktion wird mit Zeigern verwendet. Zur Veranschaulichung wird das obige Beispiel erweitert:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Interessanterweise bleibt ein Zeiger auch nach dem "Löschen" weiterhin funktionsfähig, jedoch wird der Wert im zugehörigen Speicherbereich unleserlich.
Dies führt zu einem Problem: Eine belegte Speicherzelle enthält nun unzuverlässige Daten. Um solche Zeiger zu vermeiden, sollte der verwendete Zeiger auf NULL zurückgesetzt werden.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Das Setzen eines Zeigers auf NULL nach dem Freigeben seines Speichers ist eine eindeutige Methode, um anzuzeigen, dass der Zeiger nicht mehr auf eine gültige Speicheradresse verweist.
Vor der Verwendung eines Zeigers immer prüfen, ob dieser NULL ist, um sicherzustellen, dass kein ungültiger oder bereits zugewiesener Speicherbereich angesprochen wird.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Can you explain more about how malloc() and free() work together?
What happens if I forget to free memory allocated with malloc()?
Why is it important to set a pointer to NULL after freeing it?
Awesome!
Completion rate improved to 2.63
Malloc und Free
Swipe um das Menü anzuzeigen
Diese Funktionen ermöglichen es, neue Objekte nicht während der Kompilierung, sondern während der Programmausführung zu erstellen, wodurch die Nutzung von dynamischer Speicherzuweisung möglich wird.
malloc()
Bisher wurde Speicher für Daten einfach durch Deklaration reserviert:
int x;
Nun kann mit der Funktion malloc() Speicher dynamisch zugewiesen werden:
int* pX = (int*)malloc(4);
Die Funktion malloc() erwartet als Argument die Anzahl der zu reservierenden Bytes. Ist die benötigte Byteanzahl nicht bekannt, aber der Datentyp, kann der Ausdruck wie folgt angepasst werden:
int* pX = (int*)malloc(sizeof(int));
Wie geht es weiter?
Beachte, dass das Ergebnis der Funktion malloc() einem Zeiger zugewiesen wird. Das bedeutet, malloc() gibt eine Adresse zurück!
Das Präfix (int*) ist ein expliziter Cast. Der gewünschte Typ wird manuell angegeben. Zum Beispiel:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Hinweis
Die Header-Datei
stdlib.hmuss eingebunden werden. Sie enthält die Deklaration der Funktionmalloc().
Um Daten an der von der Funktion malloc() bereitgestellten Adresse zu speichern, wird der Dereferenzierungsoperator verwendet.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
Ist es möglich, Speicher freizugeben? – Ja, aber nur den Speicher, der durch malloc() und ähnliche Funktionen reserviert wurde.
free()
Diese Funktion wird mit Zeigern verwendet. Zur Veranschaulichung wird das obige Beispiel erweitert:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Interessanterweise bleibt ein Zeiger auch nach dem "Löschen" weiterhin funktionsfähig, jedoch wird der Wert im zugehörigen Speicherbereich unleserlich.
Dies führt zu einem Problem: Eine belegte Speicherzelle enthält nun unzuverlässige Daten. Um solche Zeiger zu vermeiden, sollte der verwendete Zeiger auf NULL zurückgesetzt werden.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Das Setzen eines Zeigers auf NULL nach dem Freigeben seines Speichers ist eine eindeutige Methode, um anzuzeigen, dass der Zeiger nicht mehr auf eine gültige Speicheradresse verweist.
Vor der Verwendung eines Zeigers immer prüfen, ob dieser NULL ist, um sicherzustellen, dass kein ungültiger oder bereits zugewiesener Speicherbereich angesprochen wird.
Danke für Ihr Feedback!