📘 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

Frage 1
Was macht malloc?
ASpeicher freigeben
BSpeicher zur Laufzeit anfordern
CPointer dereferenzieren
DArray sortieren
Frage 2
Wann gibt malloc NULL zurück?
AWenn n=0
BWenn nicht genug Speicher
CImmer zuerst
DNach free
Frage 3
Was muss immer nach malloc aufgerufen werden?
Asizeof
Bcalloc
Cfree
Drealloc
Frage 4
Was ist ein Memory Leak?
ASpeicher der ausläuft
BSpeicher der nicht freigegeben wird
CEin Fehler in stdlib.h
DEin zu großes Array
Frage 5
Was gibt sizeof(int) typischerweise zurück?
A1
B2
C4
D8
Frage 6
Was ist ein Memory Leak?
AEin Speicherfehler beim Lesen
BEin zu kleines Array
CEin Pointer auf NULL
DAllokierter Speicher wird nie mit free() freigegeben
Frage 7
Was gibt malloc() zurück wenn die Speicheranforderung fehlschlägt?
ANULL
B0
C-1
DEinen ungültigen Pointer
Frage 8
Was ist der Unterschied zwischen malloc und calloc?
Acalloc ist schneller als malloc
Bcalloc initialisiert auf 0, malloc nicht
Cmalloc kann mehr Speicher anfordern
DEs gibt keinen Unterschied

📋 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