El ámbito (scope) y la duración (lifetime) de las variables son dos de los aspectos clave en la estructura de un programa en C. El ámbito es la parte del código en la que una variable es accesible por nombre. La duración define cuándo una variable realmente existe en la memoria.
Historia del tema
C fue diseñado para control de bajo nivel, por lo que proporciona un enfoque flexible pero peligroso sobre el ámbito y la duración a través de la clasificación de variables según su declaración (local, de archivo, global, estática).
Problema
La comprensión incorrecta del scope/lifetime conduce a errores clásicos: intentar acceder a variables que no están disponibles o que ya han sido destruidas (use-after-free), conflictos de nombres entre variables globales y locales (variables en sombras), modificación accidental de variables globales.
Solución
Definir explícitamente el tipo de almacenamiento necesario (auto, static, extern), usar razonablemente el ámbito de bloque, minimizar la cantidad de variables globales, y distinguir claramente la duración en el stack y fuera del stack.
Ejemplo de código:
int global_var; // Global, vive todo el tiempo de ejecución void func() { int local_var = 5; // Automática, vive dentro de func() static int stat_var = 0; // Estática, vive entre llamadas stat_var++; }
Características clave:
¿Qué sucederá si se declaran dos variables con el mismo nombre en diferentes bloques?
La variable interna ocultará a la externa (variable en sombra). Esto puede llevar a errores inesperados.
int x = 10; ... if (1) { int x = 50; printf("%d", x); // imprime 50, la x global está oculta }
¿Cuál es la duración de una variable automática definida dentro de una función?
Solo existe durante la llamada a la función. Después de salir, la memoria se libera y el valor se pierde.
¿Puede una variable local estática ser utilizada fuera de la función donde está declarada?
No, su ámbito es solo dentro de la función. Es invisible desde afuera, a pesar de que su duración es durante toda la ejecución del programa.
void f() { static int x = 0; } // No accesible fuera de f()
static vs auto).Un desarrollador principiante crea un contador dentro de un bucle como static, y este contador "acumula" valores entre iteraciones, aunque se esperaba que se reiniciara cada vez.
Ventajas:
Desventajas:
Un desarrollador utiliza static estrictamente para almacenamiento en caché, y para necesidades temporales, variables auto normales.
Ventajas:
Desventajas: