- 01Was passiert hier
free() gibt den Heap-Block an malloc zurück. Der Stack-Pointer arr bleibt unverändert — er zeigt weiter auf dieselbe Adresse. Daher der Name dangling pointer (baumelnder Zeiger). Du kannst arr noch dereferenzieren, der Compiler sagt kein Wort.
- 02Warum nichts sofort crasht
Der freigegebene Block ist noch im Adressraum deines Prozesses — das Betriebssystem hat ihn noch nicht zurückgenommen. malloc markiert ihn nur als verfügbar. Heißt: du liest alte Werte, klappt manchmal, bricht spätestens dann, wenn malloc den Block neu vergibt und du fremde Daten liest.
- 03Warum C das nicht verhindert
C verlangt Lifetime-Tracking vom Entwickler. free() ist nur ein normaler Funktionsaufruf — der Compiler sieht keinen Zusammenhang zwischen free(arr) und einem späteren arr[0]. Java/Python haben Garbage Collection und Bounds-Checking; in C ist das deine Aufgabe.
Nach jedem free() sofort `arr = NULL;` setzen. Der nächste Zugriff erzeugt dann garantiert einen Segfault — der Bug wird sichtbar statt heimlich. Failing fast > Silent Corruption. In großen Codebases spart dir das Tage Debug-Zeit.