Speicher freigeben mit free()
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 35 von 63.
Wenn du dynamisch Speicher mit malloc() zuweist, bleibt dieser Speicher zugewiesen, bis du ihn ausdrücklich freigibst. Die Funktion free() ist dein Werkzeug, um dynamisch zugewiesenen Speicher an das System zurückzugeben, wenn du ihn nicht mehr verwendest.
Die Funktion free() akzeptiert ein Argument: einen Zeiger auf den Speicherblock, den du freigeben möchtest. 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 zuweisen
*ptr = 42; // Den Speicher verwenden
free(ptr); // Den Speicher freigeben, wenn fertigWenn du free() nicht aufrufst, entsteht etwas, das als Speicherleck bezeichnet wird. Der reservierte Speicher bleibt von deinem Programm belegt, obwohl du ihn nicht mehr verwendest. In lang laufenden Programmen oder Programmen, die wiederholt Speicher reservieren, können diese Lecks den gesamten verfügbaren Systemspeicher aufbrauchen und zu Leistungsproblemen oder Abstürzen führen.
Denke daran: Jedem malloc() sollte ein entsprechendes free() zugeordnet sein. Diese Zuordnung ist für eine verantwortungsvolle Speicherverwaltung in der C-Programmierung unerlässlich.
Aufgabe
EinfachSchreibe ein C-Programm, das den vollständigen Lebenszyklus der dynamischen Speicherzuweisung und -freigabe demonstriert. Dein Programm sollte:
- Ein
countvom Benutzer einlesen, das angibt, wie vieleintegersgespeichert werden sollen malloc()mitsizeof()verwenden, um dynamischmemoryfür ein Array auscountintegerszuzuweisen- Prüfen, ob die
memory-allocationsuccessfulwar – falls sie fehlschlägt,Memory allocation failed!ausgeben und das Programm beenden - Wenn die
allocationerfolgreich ist,Memory allocated successfully!ausgeben countganzzahlige Werte vom Benutzer einlesen und in dem zugewiesenen Array speichern- Die Summe aller Werte berechnen und im folgenden Format ausgeben:
Sum: [value] - Den maximalen Wert ermitteln und im folgenden Format ausgeben:
Maximum: [value] free()verwenden, um denmemoryfreizugebenMemory freed successfully!ausgeben, um die Bereinigung zu bestätigen
Denke daran, den Header <stdlib.h> einzubinden, um malloc() und free() zu verwenden. Diese Herausforderung demonstriert die wesentliche Kombination aus malloc() und free(), um memory-Leaks in deinen Programmen zu verhindern.
Wenn die Eingabe beispielsweise lautet:
4
15 8 23 12Deine Ausgabe sollte lauten:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Diese Herausforderung festigt das wichtige Konzept, dass jeder dynamisch zugewiesene memory-Block ordnungsgemäß freigegeben werden muss, sobald er nicht mehr benötigt wird, und damit den verantwortungsvollen memory-Verwaltungszyklus in der C-Programmierung abschließt.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Lies die Anzahl der zu speichernden Ganzzahlen
scanf("%d", &count);
// TODO: Schreibe deinen Code darunter
// 1. Speicher mit malloc() und sizeof() allozieren
// 2. Prüfe, ob die Allokation erfolgreich war
// 3. Lies die Ganzzahlwerte und speichere sie
// 4. Berechne die Summe und finde das Maximum
// 5. Gib den allozierten Speicher frei
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-Funktionen6Speicherverwaltung
Stack vs. Heap SpeicherDynamische Allokation - malloc()Verwendung von sizeof() für die AllokationÜberprüfung auf AllokationsfehlerSpeicher freigeben mit free()Allokation mit calloc()Rückblick: Dynamische ArraysÜbe selbstständig: Online-C-Compiler