📘 Kapitel 6 · Zeiger & Speicher

Dynamische
Speicherverwaltung

malloc · free · sizeof · Heap vs. Stack · Memory Leak

28 / 30 Units
Ömer
Unit 28 von 30 ~45 Min. Theorie + Simulator + Quiz + Spickzettel
Ömer
Ömer sagt:

malloc gibt dir Speicher zur Laufzeit – so viel wie du brauchst! Aber du bist selbst verantwortlich: jedes malloc braucht genau ein free, sonst gibt es einen Memory Leak!

malloc und free

malloc.cC
#include <stdlib.h>
int n = 10;
int *arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) { printf("Fehler!\n"); return 1; }
/* ... Array benutzen ... */
free(arr); // Speicher freigeben!
FunktionZweck
malloc(n)n Bytes anfordern
calloc(n, s)n×s Bytes, mit 0 initialisiert
free(p)Speicher freigeben
sizeof(int)Größe des Typs in Bytes

⚠️ Jedes malloc braucht ein free!

Vergisst du free(), entsteht ein Memory Leak – Speicher bleibt belegt. Immer NULL-Check nach malloc!

Stack vs. Heap

In C gibt es zwei grundlegende Speicherbereiche. Lokale Variablen leben auf dem Stack – der Heap ist für dynamisch allokierten Speicher via malloc.

StackHeap
VerwaltungAutomatischManuell (malloc/free)
GrößeBegrenzt (~1–8 MB)Nur durch RAM begrenzt
GeschwindigkeitSehr schnellEtwas langsamer
LebensdauerBis Funktion endetBis free() aufgerufen wird
Typisch fürLokale Variablen, Arrays (bekannte Größe)Große Arrays, Größe erst zur Laufzeit bekannt

Wann Heap benutzen?

Wenn die Größe des Arrays erst zur Laufzeit bekannt ist (z.B. der Benutzer gibt die Anzahl ein), oder wenn die Daten eine Funktion überleben müssen, ist der Heap die richtige Wahl.

malloc, calloc, realloc

Die Standardbibliothek <stdlib.h> bietet drei Allokations-Funktionen mit unterschiedlichem Verhalten:

FunktionZweckInitialisiert?
malloc(n)n Bytes allokierenNein (Garbage Values!)
calloc(n, size)n Elemente × size Bytes, alle auf 0Ja (0)
realloc(ptr, n)Bestehenden Block auf n Bytes ändernNeue Bytes nicht init.
free(ptr)Speicher freigeben—

malloc liefert uninitialisierte Daten!

Nach malloc enthalten die Bytes zufälligen Inhalt ("Garbage"). Verwende calloc wenn du sicher mit 0 starten willst, oder initialisiere jeden Wert manuell.

Memory Leak – der stille Fehler

Ein Memory Leak entsteht wenn allokierter Speicher nie mit free() freigegeben wird. Das Programm läuft weiter, belegt aber immer mehr RAM – bei Serverprogrammen oder lang laufenden Prozessen kann das zum Absturz führen.

leak.cC
void leak() {
    int *arr = (int*) malloc(10 * sizeof(int));
    // free(arr) vergessen!
    return;  // Speicher bleibt belegt – Memory Leak!
}

Memory Leaks erkennen

Das Programm läuft scheinbar normal, aber belegt immer mehr RAM. Bei Serverprogrammen oder lang laufenden Prozessen kritisch – das System wird mit der Zeit langsamer und stürzt schließlich ab. Tools wie Valgrind helfen Memory Leaks zu finden.

Häufige Fehler

FehlerFolgeLösung
NULL-Check vergessenCrash bei SpeichermangelImmer if (ptr == NULL) nach malloc
free() zweimalDouble free → Crash / Undefined BehaviorNach free: ptr = NULL;
Use-after-freeUndefined Behavior, DatenverfälschungPointer nach free auf NULL setzen
Größe falschZu wenig Speicher allokiertImmer n * sizeof(Typ) verwenden

Goldene Regel: jedes malloc hat genau ein free

Nach free(ptr) immer ptr = NULL; setzen. So wird ein versehentlicher zweiter free()-Aufruf harmlos (free(NULL) tut nichts) und ein Zugriff über den Pointer ist sofort als Bug erkennbar.

⚡ Code-Simulator

Teste den Code direkt im Browser – printf-Ausgaben werden simuliert:

C Simulator – Unit 28
▶ Ausgabe
– Klicke AUSFÜHREN –
Ömer
Ömer sagt:

Experimentiere mit dem Code – das ist der beste Weg um Pointer und structs wirklich zu verstehen!

🎯 Wissens-Quiz

Fragen werden geladen …

📋 Spickzettel

malloc/free
malloc(n*sizeof(T))n Elemente anfordern
if(p==NULL)Immer prüfen!
free(p)Speicher freigeben
#include Nötig für malloc
Stack vs Heap
StackLokal, automatisch
Heapmalloc, manuell
Stack-Limit~1-8 MB
HeapViel größer

✅ Checkliste Unit 28

  • Ich kann malloc und free korrekt verwenden
  • Ich führe nach malloc immer einen NULL-Check durch
  • Ich verstehe den Unterschied zwischen Stack und Heap
  • Ich vermeide Memory Leaks durch konsequentes free