Hintergrund: Globale und statische Variablen wurden in der Programmiersprache C eingeführt, um Daten außerhalb des lokalen Kontextes von Funktionen zu speichern. Die automatische Vorinitialisierung und Platzierung in speziellen Abschnitten der ausführbaren Datei optimieren die Programmausführung, können jedoch zu wenig offensichtlichem Verhalten führen, wenn man dies nicht versteht.
Problem: Es ist wichtig zu wissen, dass globale und statische Variablen in C entweder mit einem ausdrücklich festgelegten Wert oder automatisch mit Nullen (Zero Initialization) initialisiert werden. Die Initialisierung erfolgt vor dem Beginn von main, was das Risiko des Zugriffs auf nicht initialisierte Daten verringert, aber unter bestimmten Bedingungen zu unerwarteten Abhängigkeiten führen kann, die mit der Initialisierung mehrerer Module und deren Lade-Reihenfolge zusammenhängen.
Lösung:
Beispielcode:
#include <stdio.h> static int stat_var; int glob_var = 42; int main() { printf("static: %d, global: %d\n", stat_var, glob_var); }
Hauptmerkmale:
1. Kann man sich auf die implizite Nullinitialisierung statischer Variablen verlassen und dies als sichere Praxis betrachten?
Technisch funktioniert es, aber in großen Projekten ist es besser, Variablen zur Lesbarkeit und zur Vermeidung möglicher Änderungen in Compilern/Linkern explizit zu initialisieren.
2. Was passiert, wenn eine statische Variable in einer externen Funktion ohne Initialisierung deklariert wird?
Sie wird dennoch mit Null initialisiert: static int value; ist bei der Ausführung immer 0.
3. Wann erfolgt die Initialisierung einer globalen Variablen mit einem Initialisierer, wenn die Variable in einem separaten isolierten Modul deklariert wird?
Die Initialisierung erfolgt vor dem Aufruf von main, aber zwischen verschiedenen Modulen garantiert der Standard nicht die Reihenfolge der Initialisierung solcher Variablen, was zu einem möglichen Zugriff auf nicht initialisierte Daten im Konstruktor eines anderen Moduls führen kann.
Ein Entwickler erklärte statische Variablen zur Speicherung des gemeinsamen Zustands in der Annahme, dass diese immer explizit initialisiert werden.
Vorteile:
Nachteile:
Nach dem Review wurden die Variablen beim Deklarieren explizit initialisiert.
Vorteile:
Nachteile: