Entendiendo las clases de almacenamiento en C: auto, extern, static, register explicados
¿Qué es una clase de almacenamiento en C?
Una clase de almacenamiento define el alcance, ubicación, inicialización, vida y accesibilidad de una variable. En C, cada variable no solo tiene un tipo, sino que también se le asigna una clase de almacenamiento que determina dónde y cómo puede ser accedida.
Hay cuatro clases de almacenamiento estándar:
- auto – predeterminada para variables locales.
- extern – declara una variable global o función que existe en otro archivo.
- static – preserva el valor de una variable entre llamadas y limita la visibilidad a un archivo o función.
- register – sugiere al compilador almacenar una variable en un registro de CPU para acceso más rápido.
Clase de almacenamiento Auto
Las variables declaradas con auto (la predeterminada para variables locales) existen solo dentro del bloque donde se definen. Se destruyen cuando el bloque sale, y se inicializan con un valor indeterminado a menos que se establezcan explícitamente.
int sumar(void) { int a = 13; auto int b = 48; // auto es opcional return a + b; }
Demostración de alcance:
#include <stdio.h> int main(void) { auto int j = 1; { auto int j = 2; { auto int j = 3; printf("%d ", j); // imprime 3 } printf("\t%d ", j); // imprime 2 } printf("%d\n", j); // imprime 1 }
Salida: 3 2 1
Clase de almacenamiento Extern
La palabra clave extern declara una variable o función que está definida en otra unidad de traducción. Permite compartir datos entre archivos fuente.
/* main.c */ #include <stdio.h> extern int i; // declaración int main(void) { printf("valor del entero externo es = %d\n", i); return 0; } /* original.c */ #include <stdio.h> int i = 48; // definición
Compila ambos archivos juntos: gcc main.c original.c -o programa. Ejecutando ./programa se obtiene:
valor del entero externo es = 48
Clase de almacenamiento Static
- Static local – visible solo dentro de la función pero persiste entre llamadas.
- Static de ámbito de archivo – visible solo dentro del archivo donde se declara.
/* static global */ static int contador = 7; void siguiente(void) { /* static local */ static int iteracion = 13; iteracion++; printf("iteracion=%d y contador=%d\n", iteracion, contador); } int main(void) { while (contador < 10) { siguiente(); contador++; } return 0; }
Salida:
iteracion=14 y contador=7 iteracion=15 y contador=8 iteracion=16 y contador=9
Clase de almacenamiento Register
Usa register cuando una variable necesita ser accedida frecuentemente y puede caber en un registro de CPU. El compilador puede ignorar la sugerencia si los registros son escasos.
#include <stdio.h> int main(void) { register int peso; /* intentar tomar su dirección falla */ // int *ptr = &peso; // error de compilación return 0; }
Compilar el código produce:
error: address of register variable 'peso' requested
Tabla resumen
| Clase de almacenamiento | Contexto de declaración | Ubicación de almacenamiento | Valor por defecto | Alcance | Vida |
|---|---|---|---|---|---|
| auto | dentro de una función/bloque | Memoria | Impredecible | Función/bloque | Función/bloque |
| register | dentro de una función/bloque | Registro CPU | Impredecible | Función/bloque | Función/bloque |
| extern | fuera de todas las funciones | Memoria | Cero | Todo el programa | Tiempo de ejecución del programa |
| static (local) | dentro de una función/bloque | Memoria | Cero | Función/bloque | Tiempo de ejecución del programa |
| static (global) | fuera de todas las funciones | Memoria | Cero | Archivo | Tiempo de ejecución del programa |
Conclusiones clave
- Las clases de almacenamiento controlan la visibilidad y vida de las variables.
- Usa
autopara variables locales estándar. - Usa
registerpara contadores críticos de rendimiento (sujeto a soporte del compilador). - Usa
staticpara preservar estado entre llamadas a funciones o limitar ámbito de archivo. - Usa
externpara compartir variables o funciones entre archivos fuente.
Lenguaje C
- Clases y objetos en C#: Fundamentos para POO robusta
- Palabra clave static en C#: Dominando variables, métodos y clases estáticas
- Entendiendo clases anidadas en C#: Definición, uso y herencia
- Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
- Funciones y clases amigas en C++: dominando el control de acceso
- Dominando las plantillas de clase en C++: guía práctica
- Entendiendo las clases de almacenamiento en C: ámbito, vida y rendimiento
- Entendiendo las clases de almacenamiento en C: Alcance, vida útil y uso
- Entendiendo las Clases de Almacenamiento en C++: Alcance, Vida y Uso
- Interfaces en C++: Dominando Clases Abstractas y Funciones Virtuales Puras
- Estructura de Programa C#: Componentes Principales y Ejemplo Hello World