Una variable local estática se define utilizando la palabra clave static dentro de una función. A diferencia de las variables locales normales, conserva su valor entre llamadas a la función y se inicializa solo una vez. Esta variable existe durante toda la vida del programa, pero solo es visible dentro de su propia función.
Variable local normal:
void func() { int count = 0; // se inicializa cada vez count++; printf("%d\n", count); }
Cada vez que se llama, la salida es 1.
Variable local estática:
void func() { static int count = 0; // se inicializa solo una vez count++; printf("%d\n", count); }
En llamadas sucesivas, obtendremos como salida: 1, 2, 3, ...
Uso: conveniente para contar el número de llamadas a la función, cacheando valores simples.
"¿Se destruirá una variable local estática después de salir de la función y qué sucederá con su valor en la siguiente llamada a la función?"
A menudo se responde que se destruye, pero no es así.
Respuesta correcta: La variable local estática existe durante toda la vida del programa. Conserva su valor entre llamadas a la función y se inicializa solo una vez (en la primera entrada a la función o antes de main).
Historia 1
En un proyecto se medían los tiempos de entrada al módulo a través de una función que debía contar cada entrada. Se confundió int counter = 0; con static int counter = 0; — la función siempre devolvía 1, la estadística resultó inútil.
Historia 2
En un servicio no seguro para hilos, se utilizó una variable estática en una función que era llamada desde diferentes hilos. Esto llevó a condiciones de carrera y resultados incorrectos aleatorios. No se tuvo en cuenta que la memoria compartida no estaba protegida.
Historia 3
Se mantuvo un puntero a memoria dinámica asignada en una variable estática para caching. Al reiniciar la función, no se liberaba la memoria anterior: se produjo una fuga de memoria en cada llamada.