Sziasztok! Nemrégiben egy projektemnél belefutottam egy olyan helyzetbe ahol sajnos elbizonytalanodtam hogy jól értem-e a változók működését. A problémám a következő:
void loop() {
int a = 0;
do {
a++;
search();
} while (a < 10);
}
void search() {
}
A loop ciklusban létrehoztam az "a" helyi változót, ami tudtommal csak a saját függvényében él, azon kívül nem elérhető, illetve a memóriában is felszabadul az általa lefoglalt terület. Namost mivel a program a változó deklarálása után azonnal egy while ciklusba lép, már nem fut le újra a változó értékadása, viszont közben egy másik függvényt is meghívok. Ekkor elvileg a változóm megsemmisül. Vagy mégse? Az search() függvény lefutása után ott folytatódik a while ciklusom ahol abbamaradt, de vajon megőrzi-e ilyenkor "a" változó az értékét? A gyakorlat azt mutatja hogy igen de nem értem miért. Én ezt azzal magyaráztam magamnak hogy a memória területen megmarad ugyan a változó értéke, de ha esetleg egy másik függvényben több helyi változót használok, az felül írhatja az eredeti "a" változó értékét. Tehát a memória terület felszabadul és írhatóvá válik, de nem feltétlenül íródik rá valami. Vagy valamit az alapoknál félre értelmezek?
Helyi változók élettartama
Re: Helyi változók élettartama
A függvényen belül deklarált változó ugyanazon a függvényen belül a deklaráció utántól kezdődően bárhol megvan, nem veszik el, bármit hívsz, megmarad az értéke, persze a "bármiben" nem elérhető
Re: Helyi változók élettartama
Ez nem csak a statikus változókra igaz?
Re: Helyi változók élettartama
Tipp, ahogy én szoktam megközelíteni és magyarázni:
A változó abban a "mederben" él, létezik, ami a { és } közt van. Ezen belül újabb {} hozhatok létre - itt az egy "belső medence", onnan is elérhető. Akkor tűnik el, ha a fő ] is bezárul.
Az hogy belül hívok egy alprogramot/függvényt, bármit - azzal nem zártam be az előző programot, azaz nem jutottam el a záró }-ig.
Tipp:
Itt a legbelső search() önmagát hívja meg, és a belül lefoglalt "b" integer, minden egyes meghíváskor lefoglal 2-2 byte-t! Végül a SRAM fogy el és memóriahiba, regiszterfelülírás lesz...
Elvileg belül a freemem() függvénnyel soros vonalra is kiírható. hogy a szabad memória hogyan alakul belül....
A változó abban a "mederben" él, létezik, ami a { és } közt van. Ezen belül újabb {} hozhatok létre - itt az egy "belső medence", onnan is elérhető. Akkor tűnik el, ha a fő ] is bezárul.
Az hogy belül hívok egy alprogramot/függvényt, bármit - azzal nem zártam be az előző programot, azaz nem jutottam el a záró }-ig.
Tipp:
Kód: Egész kijelölése
void loop() {
int a = 0;
do {
a++;
search();
}
while (a < 10);
}
void search()
{ int b = 1;
search (); / saját magába farkába harapó gömböc
}
Elvileg belül a freemem() függvénnyel soros vonalra is kiírható. hogy a szabad memória hogyan alakul belül....
http://www.tavir.hu - a gazda
Re: Helyi változók élettartama
A C azért meg tudja kavarni a dolgokat.
Ha a loop-on belüli helyi változód átadod egy függvényben referencia szerint (nem érték szerint adsz át paramétert), akkor egy külső függvény felülírhatja a belső változód értékét.
De egyébként úgy működik, ahogy Róbert írta a medencékkel.
Annyi megjegyzés még, hogy belső medencében létrehozott változó a külsőben nem látszik.
Ez a lenti program hibás, mert a végén lévő i+=j utasításban a j változó már nem létezik. Az a változó csak a for cikluson belül létezik.
loop()
{
int i=0;
for(int j=0; j<10; j++)
{
i+=j;
}
i+=j;
}
Ha a loop-on belüli helyi változód átadod egy függvényben referencia szerint (nem érték szerint adsz át paramétert), akkor egy külső függvény felülírhatja a belső változód értékét.
De egyébként úgy működik, ahogy Róbert írta a medencékkel.
Annyi megjegyzés még, hogy belső medencében létrehozott változó a külsőben nem látszik.
Ez a lenti program hibás, mert a végén lévő i+=j utasításban a j változó már nem létezik. Az a változó csak a for cikluson belül létezik.
loop()
{
int i=0;
for(int j=0; j<10; j++)
{
i+=j;
}
i+=j;
}