Eine statische lokale Variable wird mit dem Schlüsselwort static innerhalb einer Funktion definiert. Im Gegensatz zu normalen lokalen Variablen behält sie ihren Wert zwischen den Funktionsaufrufen und wird nur einmal initialisiert. Diese Variable existiert während der gesamten Laufzeit des Programms, ist jedoch nur innerhalb ihrer Funktion sichtbar.
Normale lokale Variable:
void func() { int count = 0; // wird bei jedem Aufruf neu initialisiert count++; printf("%d\n", count); }
Jedes Mal ist das Ergebnis — 1.
Statische lokale Variable:
void func() { static int count = 0; // wird nur einmal initialisiert count++; printf("%d\n", count); }
Bei aufeinanderfolgenden Aufrufen erhalten wir die Ausgabe: 1, 2, 3, ...
Verwendung: Praktisch zum Zählen der Aufrufe einer Funktion, zur Zwischenspeicherung einfacher Werte.
"Wird die statische lokale Variable nach dem Verlassen der Funktion zerstört und was geschieht mit ihrem Wert beim nächsten Funktionsaufruf?"
Oft wird gesagt, dass sie zerstört wird, aber das ist nicht korrekt.
Richtige Antwort: Die statische lokale Variable existiert während der gesamten Laufzeit des Programms. Sie behält ihren Wert zwischen den Funktionsaufrufen und wird nur einmal (beim ersten Betreten der Funktion oder vor main) initialisiert.
Geschichte 1
In einem Projekt wurden die Zeitmessungen für den Eintritt in ein Modul über eine Funktion, die jeden Eintritt zählen sollte, erfasst. int counter = 0; wurde mit static int counter = 0; verwechselt — die Funktion gab immer 1 zurück, die Statistik war nutzlos.
Geschichte 2
In einem nicht-thread-sicheren Dienst wurde eine statische Variable in einer Funktion verwendet, die aus verschiedenen Threads aufgerufen wurde. Dies führte zu Race Conditions und zufällig falschen Ergebnissen. Es wurde nicht berücksichtigt, dass der gemeinsam genutzte Speicher nicht geschützt ist.
Geschichte 3
Ein Zeiger auf dynamisch zugewiesenen Speicher wurde in einer statischen Variablen zur Zwischenspeicherung gespeichert. Bei jedem Funktionsaufruf wurde nicht der alte Speicher freigegeben: Es trat ein Speicherleck bei jedem Aufruf auf.