- Programmazione » Programmazione » Guida C - Manuale programmazione con articoli e risorse interessanti
Le variabili automatic
L'ACCESSIBILITÀ' E LA DURATA DELLE VARIABILI
Qualsiasi variabile dichiarata all'interno di un blocco
di codice racchiuso tra parentesi graffe (generalmente
all'inizio di una funzione) appartiene per default alla
classe automatic. Non è dunque necessario,
anche se è possibile farlo, utilizzare la parola
chiave auto. La durata e la visibilità della
variabile sono entrambe limitate al blocco di codice in cui
essa è dichiarata. Se una variabile è
dichiarata in testa ad una funzione, essa esiste (cioè
occupa memoria) dal momento in cui la funzione inizia ad
essere eseguita, sino al momento in cui la sua esecuzione
termina.
Le variabili automatic, dunque, non occupano spazio di
memoria se non quando effettivamente servono; inoltre,
essendo accessibili esclusivamente dall'interno di quella
funzione, non vi è il rischio che possano essere
modificate accidentalmente da operazioni svolte in funzioni
diverse su variabili aventi medesimo nome: in un programma C,
infatti, più variabili automatic possono avere lo
stesso nome, purché dichiarate in blocchi di codice
diversi. Se i blocchi sono nidificati (cioè uno
è interamente all'interno di un altro) ciò
è ancora vero, ma la variabile dichiarata nel blocco
interno "nasconde" quella dichiarata con identico
nome nel blocco esterno (quando, ovviamente, viene eseguito
il blocco interno).
Vediamo un esempio:
#include
void main(void)
{
int x = 1;
int y = 10;
{
int x = 2;
printf("%d, %d
" ,x,y);
}
printf("%d, %d
" ,x,y);
}
La variabile x dichiarata in testa alla funzione main() è inizializzata a 1, mentre la x dichiarata nel blocco interno è inizializzata a 2. L'output del programma é:
2, 10
1, 10
Ciò prova che la "prima" x esiste
in tutta la funzione main(), mentre la
"seconda" esiste ed è visibile solo nel
blocco più interno; inoltre, dal momento che le due
variabili hanno lo stesso nome, nel blocco interno la prima
x è resa non visibile dalla seconda. La
y, invece, è visibile anche nel blocco
interno.
Se si modifica il programma dell'esempio come
segue:
#include
void main(void)
{
int x = 1;
int y = 10;
{
int x = 2;
int z = 20;
printf("%d, %d
" ,x,y);
}
printf("%d, %d
" ,x,y,z);
}
il compilatore non porta a termine la compilazione e segnala
l'errore con un messaggio analogo a "undefined
symbol z in function main()" a significare che la
seconda printf() non può referenziare la
variabile z, poiche questa cessa di esistere al
termine del blocco interno di codice.
La gestione delle variabili automatic è dinamica. La
memoria necessaria è allocata alla variabile
esclusivamente quando viene eseguito il blocco di codice
(tipicamente una funzione) in cui essa è dichiarata, e
le viene "sottratta" non appena il blocco termina.
Ciò implica che non è possibile conoscere il
contenuto di una variabile automatic prima che le venga
esplicitamente assegnato un valore da una istruzione facente
parte del blocco: a beneficio dei distratti, vale la pena di
evidenziare che una variabile automatica può essere
utilizzata in lettura prima di essere
inizializzata[23], ma il valore in essa contenuto è
casuale e, pertanto, inutilizzabile nella quasi
totalità dei casi.
E' opportuno sottolineare che mentre le variabili
dichiarate nel blocco più esterno di una funzione
(cioè in testa alla stessa) esistono e sono visibili
(salvo il caso di variabili con lo stesso nome) in tutti i
blocchi interni di quella funzione, nel caso di funzioni
diverse nessuna di esse può accedere alle variabili
automatiche delle altre.
- Articolo precedente L'accessibilità e la durata delle variabili
- Articolo successivo Le variabili register