[ Aleksa Stankovic @ 04.07.2008. 12:01 ] @
Bas sam zbunjen, ovo mi je mnogo cudno ponasanje. Evo koda:

Code:


#include <cstdio>
void f()
{
    int b;
    printf("%d n",b);
    b=2;
}
int main()
{
    f();
    f();
    return 0;
}



Mozda treba malo objasnjenje programa:
Program zapravo ne radi nista korisno, vec mi je sluzio da objasnim static promenljive. (umesto int b stavio sam prvo static int b). Naravno sa static int b rezultat je bio ocekivan, kada bi b dobilo vrednost 2 pri sledecem pozivu funkcije f otstamapana bi bila vrednost 2(za b). Onda ja izbrisem rec static(i dobijem gore napisan kod). I onda dobijem isti rezultat, sto mi nije jasno. Zar u ovom slucaju kada se izvrsi funkcija f() zatvore se zagrade{} i automatska promenljiva b treba da se izbrise. Pri sledecem pozivu funkcije b bi opet trebalo da da neku proizvoljnu vrednost. Ali to se ne desava. Zasto?

nadam se da ste me shvatili :)
[ karas @ 04.07.2008. 13:07 ] @
Promenljiva se izbrise u smislu da joj se vise ne moze (ili ne bi trebalo) pristupati, a ne da se na to mesto u memoriji upisuju nule ili nekako drugacije obrise. Tako, kad unistis b pa ga onda opet kreiras moze da se desi da sadrzi vrednost sa istog memorijskog mesta. Kako zaredom pozivas f() tj. dva puta vrednosti bacas na stek, ovakav scenario je prilicno verovatan.
[ Aleksa Stankovic @ 04.07.2008. 13:49 ] @
Veoma zanimljivo, i pomalo cudno(makar za mene)...
Hvala na objasnjenju!
[ karas @ 04.07.2008. 14:46 ] @
C++ prilikom kreiranja automatske promenljive rezervise memoriju ali inicijalizaciju moras sam da uradis, preko konstruktora ili dodele vrednosti. Inace, vrednost koju sadrze nije definisana tj. sadrze neku slucajnu vrednost koja se nasla u tom parcetu memorije.
Lokalne staticke dobijaju inicijalnu vrednost (nulu) iako ti to ne uradis. Detalje mozes naci na http://www.steveheller.com/cppad/Output/function7.html
[ Aleksa Stankovic @ 04.07.2008. 15:08 ] @
Dobar sajt.
Hvala jos jednom!
[ Burgos @ 12.07.2008. 12:49 ] @
Visual C++ 2008 izgleda briše promenljivu iz memorije, tj. popunjava ga nekim rnd podacima. Ni u jednom slučaju ne dobijam 2, tako da se ne treba uzdati u to.