Call Stack (Aufrufstapel) ist die Datenstruktur, in der ein Programm seine aktiven Funktionsaufrufe verwaltet. Jeder Aufruf einer Funktion legt einen Stack Frame auf den Stapel: die Rückkehradresse, die Parameter und die lokalen Variablen. Sobald die Funktion ihren Rückgabewert liefert, wird der Frame wieder entfernt.

Das LIFO-Prinzip

Der Call Stack arbeitet nach dem Prinzip Last In, First Out (LIFO): Die zuletzt aufgerufene Funktion wird zuerst beendet. Wenn main() die Funktion a() aufruft und a() wiederum b(), dann liegen die Frames in dieser Reihenfolge übereinander — b() endet zuerst, dann a(), dann main().

Beispiel: Python

def b():
    return 2

def a():
    return b() + 1

print(a())  # 3

Beim Aufruf von a() enthält der Stack: mainab. Nach dem return von b() wird dessen Frame entfernt, dann der von a().

Call Stack und Rekursion

Bei Rekursion ruft sich eine Funktion selbst auf — jeder rekursive Aufruf legt einen weiteren Frame auf den Stack. Wird die Rekursion nicht korrekt beendet oder ist sie zu tief, wächst der Stack unbegrenzt und es kommt zum Stack Overflow: Der Speicher ist erschöpft, das Programm bricht mit einem Fehler ab.

Call Stack im Debugging

Bei einem Fehler zeigt der Stack Trace den gesamten Call Stack zum Zeitpunkt des Absturzes: Welche Funktionen in welcher Reihenfolge aufgerufen wurden. Damit lässt sich beim Debugging der Weg zum Fehler nachvollziehen — von main() bis zur fehlerhaften Funktion.

Eigenschaften des Call Stacks

  • Begrenzter Speicher: Der Stack hat eine feste Größe; zu viele verschachtelte Aufrufe führen zum Stack Overflow.
  • Schnell: Legen und Entfernen von Frames ist sehr effizient (nur Stack-Pointer verschieben).
  • Automatisch verwaltet: Die Laufzeitumgebung legt Frames an und entfernt sie — der Entwickler greift nicht direkt darauf zu.
  • Grundlage vieler Algorithmen: Auch der Stack als abstrakter Datentyp nutzt dasselbe Prinzip.

Verwandt: Funktion, Parameter, Rückgabewert, Rekursion, Stack, Debugging, Python-Befehle, JavaScript-Befehle.