ProgrammazioneSviluppatore C

Come funzionano le variabili locali statiche nelle funzioni in C? Qual è la loro differenza rispetto alle normali variabili locali? Fornisci esempi di utilizzo e potenziali errori.

Supera i colloqui con l'assistente IA Hintsage

Risposta

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.

Domanda trabocchetto

"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).

Esempi di errori reali a causa della mancanza di conoscenza dei dettagli del tema


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.