Entendiendo las clases de almacenamiento en C: ámbito, vida y rendimiento
Entendiendo las clases de almacenamiento en C
Explore cómo las clases de almacenamiento automático, externo, estático y registro definen el ámbito, vida y rendimiento de una variable en C.
Variables automáticas (locales)
Las variables declaradas dentro de un bloque son automáticas, también conocidas como variables locales. Existen solo dentro de ese bloque y se destruyen cuando el bloque termina.
#include <stdio.h>
int main(void) {
for (int i = 0; i < 5; ++i) {
printf("Programación en C\n");
}
// Error: i no está declarado en este ámbito
printf("%d", i);
return 0;
}
Ejecutar este programa resulta en un error identificador i no declarado porque i se declara solo dentro del bloque del bucle for.
int main() {
int n1; // local a main()
}
void func() {
int n2; // local a func()
}
Aquí, n1 es inaccesible dentro de func(), y n2 es inaccesible dentro de main().
Variables globales (externas)
Las variables declaradas fuera de todas las funciones son globales o externas. Pueden ser accedidas desde cualquier función dentro de la misma unidad de traducción. Cuando una variable global se define en un archivo pero se usa en otro, la palabra clave extern indica que la definición reside en otro lugar.
Ejemplo: Variable global
#include <stdio.h>
void mostrar();
int n = 5; // variable global
int main() {
++n;
mostrar();
return 0;
}
void mostrar() {
++n;
printf("n = %d\n", n);
}
Salida
n = 7
Si n se define en archivo1.c y se usa en archivo2.c, agregue extern int n; al inicio de archivo2.c para evitar error de compilación.
Variables de registro
La palabra clave register sugiere al compilador que almacene la variable en un registro de CPU para acelerar el acceso. Los compiladores modernos realizan optimización agresiva, a menudo haciendo la pista innecesaria. Use register solo cuando el perfilado indique un cuello de botella crítico en sistemas embebidos.
Variables estáticas
Las variables estáticas se declaran con static y retienen su valor durante toda la ejecución del programa. Se inicializan solo una vez, al inicio del programa, y permanecen en existencia hasta la terminación del programa.
Ejemplo: Variable estática
#include <stdio.h>
void mostrar();
int main() {
mostrar();
mostrar();
}
void mostrar() {
static int c = 1;
c += 5;
printf("%d ", c);
}
Salida
6 11
En la primera llamada, c se inicializa a 1, luego se incrementa a 6. En la segunda llamada, c retiene su valor previo de 6, se incrementa a 11 e imprime.
En ámbito de archivo, una declaración static da a la variable enlace interno, haciéndola invisible a otras unidades de traducción—una característica útil para encapsulamiento.
Según el estándar ISO C, el comportamiento de static asegura una única instancia a través de todas las llamadas a función, lo cual es crítico para operaciones con estado sin contaminación global.
Lenguaje C
- Domine variables y tipos de datos primitivos en C#: Guía completa
- Entendiendo el ámbito de variables en C#: Nivel de clase, método y bloque
- Palabra clave static en C#: Dominando variables, métodos y clases estáticas
- Dominando las plantillas de clase en C++: guía práctica
- Variables, constantes y literales en C: guía completa
- Variables y tipos de datos en C++: Guía experta sobre int, double, char, string, bool
- Entendiendo las variables en C: Tipos, reglas de nomenclatura y gestión de memoria
- Entendiendo las clases de almacenamiento en C: Alcance, vida útil y uso
- Entendiendo las reglas de alcance en C: Variables locales, globales y formales
- Dominando punteros en C: Pasos prácticos para programación avanzada
- Entendiendo los Tipos de Variables en Java: Guía Completa