next up previous contents
Elõre: Egyszerû adatdeklarátorok Fel: Tárolási osztályokhatáskörök Vissza: Függvények tárolási osztályai

Változók élettartama és hatásköre

A tárterület foglaló tárolási egységeket élettartam és hatáskör szerint csoportosíthatjuk. A C nyelvben az élettartam kétféle lehet: a program egész futására kiterjedõ, illetve egy bizonyos blokkban tartózkodás idejére korlátozódó. Az elõbbi csoportba tartozó változókat statikusaknak, az utóbbiba tartozókat dinamikusaknak, vagy automatikusoknak (auto) nevezzük. A statikus változók tehát már a program indulásának a pillanatában léteznek, ily módon - mint látni fogjuk - kezdõértékkel is rendelkezhetnek, míg a dinamikusaknak a létrehozása és megszüntetése futás közben történik, az egyes blokkokba való belépés, illetve kilépés alkalmával. Ugyanabba a blokkba való többszöri belépéskor a dinamikus változóknak mindig egy új, friss készlete áll rendelkezésre, amelyekben nyoma sincs azoknak az értékeknek, amelyeket az utolsó kilépéskor bennük hagytunk. Éppen ezért a dinamikus változókat használó függvények rekurzív módon is hívhatók. A dinamikus tárkezelés másik elõnye, hogy sokkal jobban gazdálkodik a memóriával, hiszen az egyik blokkból kilépve, a felszabadított tárterület felhasználhatóvá válik a következõ blokk számára, azaz a változók egy része a tárban - idõeltolással - átfedheti egymást.

Hatásköri csoportosítás szerint léteznek teljesen globális (mindenhonnan elérhetõ), modulra nézve lokális (csak az adott modulból használható) és blokkra nézve lokális (csak az adott blokkon belül elérhetõ) változók. A C nyelvben az elsõ két csoportba csak statikus helyfoglalású változók tartozhatnak, az utolsóra nincs ilyen megkötés. A blokkra lokális változók hatásköre kiterjed az egész blokkra, beleértve az alblokkokat is, azonban ha egy ugyanolyan azonosítójú változót definiálunk egy alblokkban, akkor az alblokkban való tartózkodás idejére az új definíció felülbírálja az elõzõt, és új változót hoz létre, úgymond "elfedi" az eggyel magasabb hierarchiaszinten definiált változót. Az alblokkból való kilépés után a magasabb blokkban való definíció fog újra érvényesülni. Ugyanez a helyzet akkor is, ha egy blokkban egy modulra lokális, vagy teljesen globális változót definiálunk újra.

Egy változó deklarációja illetve definíciója a változó típusán kívül megadja azt is, hogy a fenti csoportok közül hová kerüljön. Ezt két dolog szabályozza: hol szerepel az adott deklarátor, és hogy milyen tárolási osztályt írunk elõ. Ezt a 1.3. táblázatban foglaltuk össze.
 

Élettartam Láthatóság Deklarátor helye Tárolási osztály
statikus globális bármely modulban 
minden blokkon kívül
extern
statikus modulra lokális adott modulban 
minden blokkon kívül
static
statikus blokkra lokális adott blokkban static
dinamikus blokkra lokális adott blokkban auto, register
1.3 táblázat: Változók élettartama, láthatósága és tárolási osztálya

Mielõtt a deklarátorok konkrét formájára rátérnénk, szeretnénk megvilágítani a register tárolási osztályt. Ez lényegében az auto-val egyezik meg, az egyetlen eltérés, hogy ennek használatával ráirányítjuk a fordítóprogram figyelmét az adott változóra: várhatóan sokszor fogunk futás közben hozzáfordulni, ezért optimális tárolás megválasztását kérjük. Ez nem kötelezi a fordítóprogramot semmire, és az, hogy mennyiben tudja teljesíteni igényünket, attól is függ, milyen típusú változóról van szó. Csak sorszámozott, vagy pointer típusú változó lehet register tárolási osztályú. A regiszteres gépeknél az optimális tárolás általában valamelyik gépi regiszter használatát jelenti, ezért általában a gépi szó méretû változóknál képes a fordító teljesíteni a register ajánlást. Mivel az int bitszélességét mindenhol a gépi szó méretére választják, ezért ennél rövidebb méretû egész változónál a register elõírás nem célszerû. A register tárolási osztály elõírása tehát az egyik olyan eset, amikor az int használata ajánlott. Az egész típusú változúkon kívül register tárolási osztályú változónak ajánlhatók még a pointerek is.


next up previous contents
Elõre: Egyszerû adatdeklarátorok Fel: Tárolási osztályokhatáskörök Vissza: Függvények tárolási osztályai