zmienna static żyje tak długo jak żyje program |
Tak na prawdę są one zmiennymi globalnymi,
tylko że o ograniczonym zasięgu.
Co ciekawsze, mają one stały adres
w przestrzeni adresowej procesu. ;)
dlaczego przy pominięciu static, [...], tak samo dostaję wynik 3, zamiast jakiejś nieokreślonej wartości? |
W przeciwieństwie do zmiennych statycznych,
zmienne lokalne przechowywane są na stosie w tzw. ramce stosu.
W tamtym bloku kodu gdy masz jeszcze dostęp do zmiennej B,
zapisujesz adres zmiennej, która znajduje się na stosie.
Tak na prawdę tracisz w tym przypadku tylko zasięg do zmiennej B,
a ona nadal się znajduje na stosie jako "zmienna lokalna" funkcji main.
Jest duże prawdopodobieństwo, że wartość znajdująca się
pod tym adresem nie ulegnie zmianie, jednak nie jest to zapewnione.
Mówię "w tym przypadku", bo z funkcji main, wychodzi się tylko raz.
Gdybyś zwracał adres zmiennej lokalnej z wywołanej funkcji,
to byłby podobny przypadek, ale następne wywołanie dowolnej
funkcji nadpisze tą wartość... nawet jeśli nie tą samą wartością.
Adres to adres... magia stosu!