Sobes.tech
Junior

Kiedy i jak długo istnieją zmienne globalne i lokalne w C++?

sobes.tech AI

Odpowiedź od AI

Zmienne globalne

  • Czas istnienia: Od uruchomienia programu do jego zakończenia.
  • Miejsce przechowywania: Zazwyczaj w statycznym obszarze pamięci (.data lub sekcja .bss pliku wykonywalnego).
  • Inicjalizacja:
    • Zmienne globalne niestatyczne, zdefiniowane na poziomie pliku, z niestandardowymi konstruktorami, są inicjalizowane przed wywołaniem main().
    • Zmienne globalne z inicjalizacją zerową (np. int i = 0;) również są inicjalizowane przed main().
    • Zmienne zdefiniowane z const lub mające statyczny czas przechowywania są inicjalizowane podczas ładowania programu.
  • Dostępność: Widoczne we wszystkich funkcjach w zakresie.

Zmienne lokalne

  • Czas istnienia: Od momentu zdefiniowania zmiennej w bloku kodu (funkcji, pętli, instrukcji warunkowej itp.) do momentu opuszczenia tego bloku.
  • Miejsce przechowywania: Zazwyczaj na stosie (dla zmiennych automatycznych). Zmienne lokalne statyczne są przechowywane w statycznym obszarze pamięci.
  • Inicjalizacja:
    • Zmienne lokalne automatyczne nie są domyślnie inicjalizowane (zawierają "śmieci"). Wymagają jawnej inicjalizacji.
    • Zmienne lokalne statyczne są inicjalizowane raz przy pierwszym zdefiniowaniu.
  • Dostępność: Widoczne tylko w obrębie bloku kodu, w którym są zdefiniowane.

Przykłady

// Zmienna globalna
int global_variable = 10;

void some_function() {
    // Zmienna lokalna (automatyczna)
    int local_variable_1; // Nie zainicjalizowana

    // Zmienna lokalna (automatyczna) z inicjalizacją
    int local_variable_2 = 20;

    // Zmienna lokalna statyczna
    static int static_local_variable = 30; // Inicjalizuje się raz

    // Dostęp do zmiennej globalnej
    global_variable++;

    // Dostęp do zmiennych lokalnych
    local_variable_1 = global_variable;
    static_local_variable++;

    // Po wyjściu z some_function(), local_variable_1 i local_variable_2 przestają istnieć
    // static_local_variable nadal istnieje i zachowuje swoją wartość
}

int main() {
    some_function();
    some_function(); // static_local_variable zachowało swoją wartość
    // Zmienna globalna jest dostępna tutaj
    // local_variable_1 i local_variable_2 nie są dostępne

    return 0;
}

Tabela porównawcza

Cecha Zmienne globalne Zmienne lokalne (automatyczne) Zmienne lokalne statyczne
Czas istnienia Od uruchomienia programu do jego zakończenia Od definicji do opuszczenia bloku kodu Od pierwszego osiągnięcia definicji do końca programu
Miejsce przechowywania Obszar pamięci statycznej (.data, .bss) Stos Obszar pamięci statycznej (.data, .bss)
Inicjalizacja Przed wywołaniem main() lub podczas ładowania programu Nie są domyślnie inicjalizowane. Wymagają jawnej inicjalizacji Raz przy pierwszej deklaracji
Dostępność Wszędzie w zakresie pliku Tylko w obrębie bloku kodu Tylko w obrębie bloku kodu