Clases de almacenamiento en C: diferentes tipos de clases de almacenamiento [con ejemplos]
Publicado: 2020-10-21La codificación con C está muy centrada en el uso de variables en cada programa. Esos son los aspectos clave de la programación en C. Cada variable en C tiene dos propiedades; tipos y clases de almacenamiento. Entre ellos, el tipo se refiere al tipo de datos de la variable y las clases de almacenamiento en C determinan el alcance, la duración y la visibilidad de la variable. Las clases de almacenamiento en C se utilizan para encontrar la vida útil, la visibilidad, la ubicación de la memoria y el valor inicial de una variable.
En esta publicación de blog, veremos en detalle las clases de almacenamiento en C , sus tipos y cómo sus características influyen en la salida del programa con algunos ejemplos de programación. Una clase de almacenamiento en C se utiliza para representar la información de una variable.
Aprenda a crear aplicaciones como Swiggy, Quora, IMDB y más
Tabla de contenido
¿Qué son las clases de almacenamiento en C?
Las clases de almacenamiento en C asignan el área de almacenamiento de una variable que se retendrá en la memoria. Se almacenan en la memoria RAM de un sistema. Además del espacio de almacenamiento, determinan el alcance de una variable. Las variables en el programa C se almacenan en una ubicación física en la memoria aleatoria, que es principalmente la memoria del dispositivo y los registros de la CPU.
Las clases de almacenamiento en C también definen la vida útil de la variable y la denominan 'local' o 'global'. Las clases de almacenamiento también son útiles para definir el alcance o la visibilidad y el valor inicial de la variable. Hay principalmente cuatro clases de almacenamiento en C , a saber. automático , de registro , estático y externo . Discutiremos cada uno por uno más.
¿Cómo se declaran las clases de almacenamiento en C?
Las cuatro clases de almacenamiento en C se declaran en un bloque o programa con los especificadores de clase de almacenamiento, auto, register, extern, static. Hay un especificador de clase de almacenamiento más, 'typedef' que se usa en la forma sintáctica y no reserva almacenamiento. Los especificadores instruyen al compilador sobre el almacenamiento de las variables. La clase de almacenamiento externo en C le dice al compilador que la variable definida se declara con enlace externo.

Hay una diferencia clave entre definir y declarar una variable. Definir una variable se trata de asignar la memoria para la variable y declararla significa inicializarla con un valor.
Sintaxis:
storage_class_specifier data_type variable_name;
Leer: Ideas y temas de proyectos interesantes en C# para principiantes
Caso especial: cuando no se declara o define ningún especificador de clase de almacenamiento en un programa
Hay al menos un especificador de clase de almacenamiento en la declaración de la variable. Pero, en caso de que no se especifique ningún especificador de clase de almacenamiento, se siguen las siguientes reglas:
1. Las variables declaradas dentro de una función se consideran auto.
2. Las funciones declaradas dentro de una función se consideran como extern.
3. Las variables y funciones declaradas fuera de una función se consideran estáticas, con enlace externo .
¿Cuáles son los tipos de clases de almacenamiento en C?
Hay cuatro clases de almacenamiento en C , echemos un vistazo a ellas:
1. Clases de almacenamiento automático en C
Cada variable definida en una función o bloque pertenece a la clase de almacenamiento automático por defecto si no se menciona ninguna clase de almacenamiento. Las variables de una función o bloque que pertenecen a la clase de almacenamiento automático se declaran con el especificador automático. Las variables bajo auto en C son locales al bloque donde están definidas y se descartan fuera del bloque.

Un programa simple que muestra clases de almacenamiento automático:
#incluir <stdio.h>
int principal( )
{
automático int i = 11;
{
automático int i = 22;
{
automático int i = 33;
printf ("%d", i);
}
printf ("%d", i);
}
printf (“%d”, i);
}
La salida del programa:
3 2 1
Explicación:
En el programa anterior, hay tres veces que se declara la variable i. Las variables con el mismo nombre se pueden definir en diferentes bloques. Por lo tanto, este programa se compilará y ejecutará con éxito sin ningún error. La función 'printf' en el bloque más interno imprimirá 3 y la variable i en este bloque se destruirá una vez que finalice el bloque.
El siguiente, el segundo bloque exterior imprime 2 que luego es sucedido por el bloque exterior que imprime 1. Las variables automáticas se inicializan correctamente; de lo contrario, obtendrá valores indefinidos ya que el compilador no les da un valor inicial.
2. Registrar clases de almacenamiento en C
Las variables que pertenecen a una clase de almacenamiento de registros son equivalentes a auto en C pero se almacenan en los registros de la CPU y no en la memoria, de ahí el nombre. Son a los que se accede con frecuencia. El especificador de registro se utiliza para declarar la variable de la clase de almacenamiento de registros. Las variables de una clase de almacenamiento de registro son locales para el bloque donde se definen y se destruyen cuando finaliza el bloque.
Un programa simple que muestra las clases de almacenamiento de registros:
#incluir <stdio.h>
int principal()
{
registro int i = 10;
int *p = &i; //error: dirección de la variable de registro solicitada
printf ("Valor de i: %d", *p);
printf ("Dirección de i: %u", p);
}
Explicación:
En el programa anterior, el código intenta obtener la dirección de la variable i en la variable de puntero p pero como i se declara como una variable de registro, el código no se compilará y mostrará el error "Error: dirección de la variable de registro solicitada" .
Solo ciertos tipos de variables se colocan en registros. El compilador no da un valor inicial a las variables de registro.
Aprenda: C ++ Vs Java: diferencia entre C ++ y Java
3. Clases de almacenamiento estático en C
La visibilidad de las variables estáticas es cero fuera de su función o archivo, pero sus valores se mantienen entre llamadas. Las variables con clase de almacenamiento estático se declaran con el especificador estático. Las variables estáticas están dentro de una función o archivo. El especificador estático funciona de manera diferente con variables locales y globales.
Programas simples que muestran clases de almacenamiento estático con variables locales y globales:
I. Variable local
#incluir <stdio.h>
void staticDemo()
{
int estático i;
{
int estático i = 1;
printf ("%d", yo);
yo++;
}
printf ("%d", yo);
yo++;
}
int principal()
{
demostración estática();
demostración estática();
}
La salida del programa:
1 0
2 1
Explicación:
Cuando una variable local se define mediante un especificador estático, dentro de una función o bloque, se crea un espacio de almacenamiento permanente en el compilador. La variable local estática es visible para la función o el bloque donde se especifica y conserva su valor entre las llamadas de función. En el programa anterior, la variable estática i se define en dos lugares en dos bloques dentro de la función staticDemo(). staticDemo() se llama dos en la función principal. En la próxima llamada, las variables estáticas conservan sus valores anteriores y no necesitan inicializarse nuevamente.
ii. Variable global
#incluir <stdio.h>
int estático gInt = 1;
estático vacío staticDemo()
{
int estático i;
printf ("%d", yo);
yo++;
printf ("%d", globalInt);
globalInt++;
}
int principal()
{
demostración estática();
demostración estática();
}
La salida del programa:
0 1
1 2
Explicación:
Las variables estáticas deben inicializarse solo una vez en un programa y se conservan durante toda su vida útil. Tienen un valor inicial predeterminado de cero.
Cuando una variable o función global está definida por un especificador estático, esa variable o función solo es conocida por el archivo en el que está definida. Para una variable global, otras rutinas de archivo no pueden acceder y alterar su contenido ya que una variable global estática tiene un enlace interno. En el programa anterior, la variable global estática globalInt y una función estática staticDemo() se definen como estáticas y no se pueden usar fuera del archivo C.
4. Clases de almacenamiento externo en C
Las variables o funciones de clase de almacenamiento externo se declaran mediante el especificador 'extern'. Cuando una variable se declara con el especificador externo, no se asigna almacenamiento a la variable y se supone que ya se ha definido en otra parte del programa. Con un especificador externo, la variable no se inicializa. La razón por la que se usa extern para especificar una variable en un programa para declararla con enlace externo.
Un programa simple que muestra clases de almacenamiento externo:
#incluir <stdio.h>
externo interno i;
int principal()
{
printf ("i: %d", i);
}
int i = 1;
Explicación:

En el programa C anterior, si se elimina extern int i, habrá un error “Identificador no declarado 'i' porque la variable i se define después de usarse en printf. El especificador externo le indica al compilador que la variable i ha sido definida y declarada aquí.
Si cambia extern int i; a externo int i = 5; obtendrá un error "Redefinición de 'i'" porque el especificador externo no inicializa una variable.
Lea también: Las 7 mejores ideas de proyectos emocionantes en C para principiantes
Ultimas palabras
Este artículo detalla el concepto de clases de almacenamiento en C y le dice cómo sus tipos difieren entre sí. Cuándo usar una clase de almacenamiento en particular depende de la asignación y el alcance, la vida útil y la visibilidad de la variable con la que está tratando.
Si está interesado en obtener más información y necesita la tutoría de expertos de la industria, consulte el Diploma PG de upGrad & IIIT Banglore en desarrollo de software de pila completa .
