Una variabile locale statica viene definita con la parola chiave static all'interno di una funzione. A differenza delle normali variabili locali, mantiene il suo valore tra le chiamate alla funzione ed è inizializzata solo una volta. Questa variabile esiste per tutta la vita del programma, ma è visibile solo all'interno della sua funzione.
Variabile locale normale:
void func() { int count = 0; // inizializzata ogni volta count++; printf("%d\n", count); }
Ogni volta l'uscita è — 1.
Variabile locale statica:
void func() { static int count = 0; // inizializzata solo una volta count++; printf("%d\n", count); }
Con chiamate successive otterremo output: 1, 2, 3, ...
Utilizzo: comodo per contare il numero di chiamate alla funzione, memorizzare valori semplici.
"La variabile locale statica verrà distrutta dopo l'uscita dalla funzione e che cosa succederà al suo valore alla prossima chiamata della funzione?"
Spesso si risponde che viene distrutta, ma non è così.
Risposta corretta: La variabile locale statica esiste per tutta la vita del programma. Mantiene il suo valore tra le chiamate alla funzione e viene inizializzata solo una volta (alla prima entrata nella funzione o prima di main).
Storia 1
In un progetto venivano misurati i tempi di accesso a un modulo tramite una funzione che doveva contare ogni accesso. Hanno confuso int counter = 0; con static int counter = 0; — la funzione restituiva sempre 1, la statistica era risultata inutile.
Storia 2
In un servizio non sicuro per i thread, è stata utilizzata una variabile statica in una funzione chiamata da diversi thread. Questo ha portato a condizioni di gara e risultati errati casuali. Non hanno considerato che la memoria condivisa non è protetta.
Storia 3
Hanno memorizzato un puntatore a memoria allocata dinamicamente in una variabile statica per memorizzazione nella cache. Non hanno liberato la vecchia memoria al riavvio della funzione: si è verificata una perdita di memoria ad ogni chiamata.