ProgramaciónDesarrollador C

¿Cómo funcionan las variables locales estáticas en las funciones en C? ¿Cuál es su diferencia con las variables locales normales? Proporcione ejemplos de uso y posibles errores.

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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.

Pregunta capciosa

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

Ejemplos de errores reales debido al desconocimiento de los matices del tema


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.