Menu
Coddy logo textTech

Speicher freigeben mit free()

Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 35 von 63.

Wenn Sie Speicher dynamisch mit malloc() reservieren, bleibt dieser Speicher reserviert, bis Sie ihn explizit freigeben. Die Funktion free() ist Ihr Werkzeug, um dynamisch reservierten Speicher an das System zurückzugeben, wenn Sie ihn nicht mehr benötigen.

Die Funktion free() nimmt ein Argument entgegen: einen Zeiger auf den Speicherblock, den Sie freigeben möchten. Dies muss derselbe Zeiger sein, der von malloc() (oder verwandten Funktionen wie calloc()) zurückgegeben wurde.

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // Speicher reservieren
*ptr = 42;  // Den Speicher verwenden
free(ptr);  // Den Speicher freigeben, wenn fertig

Das Versäumnis, free() aufzurufen, erzeugt ein sogenanntes Speicherleck. Der zugewiesene Speicher bleibt von Ihrem Programm reserviert, obwohl Sie ihn nicht mehr verwenden. In lang laufenden Programmen oder Programmen, die wiederholt Speicher zuweisen, können diese Lecks den gesamten verfügbaren Systemspeicher verbrauchen und Performance-Probleme oder Abstürze verursachen.

Denken Sie daran: Jedes malloc() sollte ein entsprechendes free() haben. Diese Paarung ist für eine verantwortungsvolle Speicherverwaltung in der C-Programmierung unerlässlich.

challenge icon

Aufgabe

Einfach

Schreiben Sie ein C-Programm, das den vollständigen Lebenszyklus der dynamischen Speicherallokation und -freigabe demonstriert. Ihr Programm sollte:

  1. Einen Ganzzahlwert count vom Benutzer einlesen, der angibt, wie viele Ganzzahlen gespeichert werden sollen
  2. malloc() zusammen mit sizeof() verwenden, um dynamisch Speicher für ein Array von count Ganzzahlen zu reservieren
  3. Überprüfen, ob die Speicherallokation erfolgreich war – falls sie fehlschlägt, geben Sie Memory allocation failed! aus und beenden Sie das Programm
  4. Wenn die Allokation erfolgreich ist, geben Sie Memory allocated successfully! aus
  5. count Ganzzahlwerte vom Benutzer einlesen und im reservierten Array speichern
  6. Die Summe aller Werte berechnen und im Format Sum: [value] ausgeben
  7. Den Maximalwert finden und im Format Maximum: [value] ausgeben
  8. free() verwenden, um den Speicher wieder freizugeben
  9. Memory freed successfully! ausgeben, um die Bereinigung zu bestätigen

Denken Sie daran, den Header <stdlib.h> einzubinden, um malloc() und free() verwenden zu können. Diese Herausforderung demonstriert die essenzielle Paarung von malloc() und free(), um Speicherlecks in Ihren Programmen zu vermeiden.

Wenn die Eingabe zum Beispiel wie folgt aussieht:

4
15 8 23 12

Sollte Ihre Ausgabe wie folgt aussehen:

Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!

Diese Herausforderung verdeutlicht das kritische Konzept, dass jeder dynamisch reservierte Speicherblock ordnungsgemäß freigegeben werden muss, wenn er nicht mehr benötigt wird, wodurch der verantwortungsvolle Zyklus der Speicherverwaltung in der C-Programmierung abgeschlossen wird.

Spickzettel

Verwenden Sie free(), um Speicher freizugeben, der mit malloc() reserviert wurde:

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // Speicher reservieren
*ptr = 42;  // Den Speicher verwenden
free(ptr);  // Den Speicher freigeben, wenn er nicht mehr benötigt wird

Jedes malloc() sollte ein entsprechendes free() haben, um Speicherlecks zu verhindern. Der an free() übergebene Pointer muss derselbe Pointer sein, der von malloc() zurückgegeben wurde.

Probier es selbst

#include <stdio.h>
#include <stdlib.h>

int main() {
    int count;
    
    // Lies die Anzahl der zu speichernden Ganzzahlen ein
    scanf("%d", &count);
    
    // TODO: Schreibe deinen Code unten
    // 1. Speicher mit malloc() und sizeof() reservieren
    // 2. Überprüfen, ob die Reservierung erfolgreich war
    // 3. Die Ganzzahlwerte einlesen und speichern
    // 4. Summe berechnen und das Maximum finden
    // 5. Den reservierten Speicher freigeben
    
    return 0;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logic & Flow