Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Malloc und Free | Zeiger
C-Grundlagen

bookMalloc 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

Main.c

copy
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.h muss eingebunden werden. Sie enthält die Deklaration der Funktion malloc().

Um Daten an der von der Funktion malloc() bereitgestellten Adresse zu speichern, wird der Dereferenzierungsoperator verwendet.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 6. Kapitel 4

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

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

bookMalloc 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

Main.c

copy
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.h muss eingebunden werden. Sie enthält die Deklaration der Funktion malloc().

Um Daten an der von der Funktion malloc() bereitgestellten Adresse zu speichern, wird der Dereferenzierungsoperator verwendet.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 6. Kapitel 4
some-alt