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
constlub mające statyczny czas przechowywania są inicjalizowane podczas ładowania programu.
- Zmienne globalne niestatyczne, zdefiniowane na poziomie pliku, z niestandardowymi konstruktorami, są inicjalizowane przed wywołaniem
- 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 |