In der Programmiersprache C bestimmt der Speicherbereich von Variablen, wo die Daten gespeichert werden, wie lange sie verfügbar sind und welcher Codebereich darauf zugreifen kann. Historisch wurden die Schlüsselwörter auto (standardmäßig für lokale Variablen), static (speichert den Wert zwischen den Aufrufen, wird häufig zur Speicherung des Zustands verwendet) und extern (erklärt eine Variable, die irgendwo anders definiert ist) eingeführt, um die Sichtbarkeit und Lebensdauer von Variablen zu steuern.
Problem — Ein falsches Verständnis davon, wo und wie lange eine Variable lebt, kann zu Zugriffsfehlern, Speicherlecks und schwer lesbarem Code führen. Zum Beispiel könnte man fälschlicherweise erwarten, dass eine lokale static-Variable bei jedem Funktionsaufruf neu erstellt wird, oder umgekehrt, dass eine auto-Variable ihren Wert zwischen den Aufrufen beibehält.
Lösung — immer bewusst den Speicherbeschreibungsbezeichner wählen und dessen Konsequenzen verstehen:
Beispielverwendung:
// main.c int global_var = 42; // hat standardmäßig den Speicherbereich static, externe Linkage void func() { static int counter = 0; // lebt zwischen den Aufrufen auto int temp = 5; // lokal, auto muss nicht unbedingt angegeben werden counter++; printf("call #%d\n", counter); } extern int global_var;
Wichtige Merkmale:
Warum überhaupt auto schreiben, wenn Variablen standardmäßig auto sind?
Antwort: In modernen C-Versionen wird das Schlüsselwort auto fast nie explizit verwendet — für eine lokale Variable ist es der Standardeigenschaftsbezeichner. Insgesamt bietet das explizite Schreiben keinen Vorteil.
Kann man static innerhalb einer Funktion verwenden, um eine globale Variable zu deklarieren?
Antwort: Nein, static innerhalb einer Funktion macht die Variable lokal, bewahrt jedoch den Zustand zwischen den Aufrufen. Sie ist außerhalb der Funktion nicht sichtbar.
Beispielcode:
void foo() { static int call_count = 0; // Nicht global, lebt aber zwischen den Aufrufen call_count++; }
Was passiert, wenn man eine Variable als extern innerhalb einer Funktion deklariert, sie jedoch nirgendwo definiert?
Antwort: Dies führt zu einem Linkerfehler, da eine Referenz auf eine globale Variable deklariert wurde, die nicht existiert.
In einem großen Projekt wurden Modulvariablen in allen Quelldateien als extern deklariert, aber man vergaß, die Definition zu machen. Infolgedessen — mysteriöse Linkerfehler, die für Anfänger verwirrend waren.
Vorteile:
Nachteile:
Man definierte die Sichtbarkeiten strikt: jede static-Variable nur im benötigten Modul, globale extern in Headern deklariert und an einem einzigen Ort definiert.
Vorteile:
Nachteile: