Historia de la cuestión:
Las variables globales y locales aparecieron en C para gestionar la memoria y el ámbito de visibilidad del código. Las variables globales eran anteriormente el principal medio para intercambiar datos entre funciones antes de la aparición de la programación modular, mientras que las locales permitieron reducir la interacción y aumentar la aislamiento del código.
Problema:
A menudo surge una falta de comprensión sobre la diferencia entre variables globales y locales: tiempos de vida, ámbitos de visibilidad, reglas y tiempo de inicialización. Las variables globales pueden conducir a problemas de sincronización y legibilidad, mientras que las locales pueden causar la inaccesibilidad de datos necesarios. Los errores en la comprensión de estas diferencias llevan a bugs y dificultan la escalabilidad del código.
Solución:
Las variables globales se declaran fuera de todas las funciones y son accesibles en todos los archivos utilizando extern. Su tiempo de vida es toda la duración del programa, y la inicialización se realiza ya sea implícitamente a ceros (para variables estáticas) o explícitamente al valor del usuario. Las variables locales se declaran dentro de las funciones, su tiempo de vida está limitado a la llamada a la función y su contenido no se inicializa automáticamente.
Ejemplo de código:
int g_var = 42; // Variable global void foo() { int l_var = 5; // Variable local }
Características clave:
¿Se inicializa automáticamente una variable local a cero si no se especifica un valor inicial?
No. Solo las variables globales y estáticas se inicializan a ceros por defecto. Las variables locales contienen "basura" (valor indefinido), a menos que se establezca un valor inicial explícitamente.
Ejemplo:
void test() { int a; printf("%d ", a); // Comportamiento indefinido }
¿Siempre se puede acceder a una variable global desde diferentes archivos?
No. Si la variable se declara como static fuera de la función, solo es visible en ese archivo fuente. Si se necesita visibilidad global, utilice extern.
¿Se puede declarar una variable global dentro de una función?
No. Dentro de una función, todas las declaraciones son locales. Solo se pueden crear variables globales fuera de las funciones.
Se usa una variable global para intercambiar datos entre funciones:
int error_code; void f1() { error_code = 1; } void f2() { if (error_code) ... }
Pros:
Contras:
Todas las variables son locales, los datos se pasan a través de los parámetros de las funciones:
void f1(int *err) { *err = 1; } void f2(int err) { if (err) ... }
Pros:
Contras: