Witam wszystkich serdecznie. Właśnie zaczytuje się w bardzo ciekawej lekturze, jaką jest symfonia C++ standard autorstwa Jerzego Grębosza i znalazłem pewną nieścisłość, czy też niedopowiedzenie, w tym, co ów autor napisał. Nie mogąc w Google znaleźć niczego, co rozwiałoby moje wątpliwości, postanowiłem napisać tutaj :)
No ale do rzeczy. W rozdziale 5 autor porusza m.in. zagadnienie zakresów ważności nazwy i czasu życia obiektów. Piszę on, iż zmienne lokalne, które są tworzone w ciele funkcji, to obiekty automatyczne, z czym się oczywiście zgadzam. Jak by nie było, są one tworzone tylko na potrzeby tej funkcji, na stosie, więc po opuszczeniu ciała funkcji, są one natychmiastowo likwidowane. Nie są one zerowane, tylko zawsze znajdują się w nich śmieci.
Pisze on również, że tylko obiekty globalne i lokalne statyczne są zerowane. Moje pytanie jest następujące: co z obiektami lokalnymi, tworzonymi np. w ciele funkcji main? Czy one również tworzone są na stosie (czyli są automatyczne)? Jakby nie było, ta funkcja ma pewne specjalne prawa (nigdzie jej nie definiujemy, nie można jej wywołać w z innej funkcji), a co najważniejsze, gdy napisałem taki krótki programik:
#include <iostream>
using namespace std;
int globalna;
inline void automatyczna(void)
{
int automatyczna;
cout << "Automatyczna wynosi = " << automatyczna << endl;
}
int main(int argc, char **argv) {
int lokalna;
cout << "Globalna wynosi = " << globalna << endl;
cout << "Lokalna wynosi = " << lokalna << endl;
automatyczna();
return 0;
}
Okazało się, że ile razy bym go nie uruchomił, dla zmiennej globalnej, czego należało się spodziewać, wychodzi zero, dla automatycznej za każdym razem są to jakieś śmieci, a co do tej zmiennej, którą nazwałem lokalna, to o dziwo też wynik to zawsze 0. Ktoś potrafi mi to wytłumaczyć?
Z góry dziękuję za pomoc.
PS. Na samym końcu rozdziału jest zamieszczone pytanie kontrolne: "Mamy następujące obiekty: globalny, lokalny, automatyczny, statyczny. O których z nich można powiedzieć, że są wstępnie inicjalizowane zerami, o których, że zawierają śmieci, a o których, nic takiego nie można powiedzieć?", co pokazuje, że jednak jakaś różnica pomiędzy obiektami lokalnymi a automatycznymi jest, tylko jeszcze nie wiem jaka ^^