Historia pytania: Zmienne globalne i statyczne pojawiły się w języku C w celu przechowywania danych poza lokalnym kontekstem funkcji. Automatyczna wstępna inicjalizacja i umieszczanie ich w specjalnych sekcjach pliku wykonywalnego optymalizują działanie programu, ale jednocześnie prowadzą do zachowań, które mogą być mało oczywiste, jeśli tego się nie rozumie.
Problem: Ważne jest, aby wiedzieć, że zmienne globalne i statyczne w C są inicjowane albo domyślną wartością, albo automatycznie zerami (Zero Initialization). Inicjalizacja odbywa się przed rozpoczęciem main, co zmniejsza ryzyko dostępu do nieinicjowanych danych, ale w pewnych warunkach prowadzi do nieoczekiwanych zależności związanych z inicjalizacją wielu modułów i porządkiem ich ładowania.
Rozwiązanie:
Przykład kodu:
#include <stdio.h> static int stat_var; int glob_var = 42; int main() { printf("statyczna: %d, globalna: %d\n", stat_var, glob_var); }
Kluczowe cechy:
1. Czy można polegać na niejawnej inicjalizacji zerowej zmiennych statycznych i uważać to za bezpieczną praktykę?
Technicznie to działa, ale w dużych projektach lepiej jawnie inicjować zmienne dla czytelności i zapobiegania możliwym zmianom w kompilatorach/linkerach.
2. Jaki będzie wynik, jeśli zmienna statyczna zostanie zadeklarowana w zewnętrznej funkcji bez inicjalizacji?
I tak zostanie zainicjowana zerem: static int value; podczas uruchamiania zawsze równa 0.
3. Kiedy następuje inicjalizacja zmiennej globalnej z inicjalizatorem, jeśli zmienna jest zadeklarowana w osobnym odizolowanym module?
Inicjalizacja odbywa się przed wywołaniem main, ale między różnymi modułami standard nie gwarantuje porządku inicjalizacji takich zmiennych, co może prowadzić do nieoczekiwanego dostępu do nieinicjowanych danych w konstruktorze innego modułu.
Programista zadeklarował zmienne statyczne do przechowywania wspólnego stanu, zakładając, że będą one zawsze jawnie inicjowane.
Zalety:
Wady:
Po przeglądzie zmienne zostały jawnie zainicjowane na etapie deklaracji.
Zalety:
Wady: