C - Clases de almacenamiento

Una clase de almacenamiento define el alcance (visibilidad) y el tiempo de vida de las variables y / o funciones dentro de un Programa C. Preceden al tipo que modifican. Tenemos cuatro clases de almacenamiento diferentes en un programa C:

  • auto
  • register
  • static
  • extern

La clase de almacenamiento automático

los auto La clase de almacenamiento es la clase de almacenamiento predeterminada para todas las variables locales.

{
   int mount;
   auto int month;
}

El ejemplo anterior define dos variables en la misma clase de almacenamiento. 'auto' solo se puede usar dentro de funciones, es decir, variables locales.

La clase de almacenamiento de registro

los registerLa clase de almacenamiento se utiliza para definir variables locales que deben almacenarse en un registro en lugar de RAM. Esto significa que la variable tiene un tamaño máximo igual al tamaño del registro (generalmente una palabra) y no se le puede aplicar el operador unario '&' (ya que no tiene una ubicación de memoria).

{
   register int  miles;
}

El registro solo debe usarse para variables que requieren acceso rápido, como contadores. También debe tenerse en cuenta que definir 'registro' no significa que la variable se almacenará en un registro. Significa que PODRÍA almacenarse en un registro dependiendo del hardware y las restricciones de implementación.

La clase de almacenamiento estático

los staticLa clase de almacenamiento le indica al compilador que mantenga una variable local en existencia durante la vida útil del programa en lugar de crearla y destruirla cada vez que entra y sale del alcance. Por lo tanto, hacer que las variables locales sean estáticas les permite mantener sus valores entre llamadas a funciones.

El modificador estático también se puede aplicar a variables globales. Cuando se hace esto, hace que el alcance de esa variable se restrinja al archivo en el que se declara.

En programación C, cuando static se usa en una variable global, hace que solo una copia de ese miembro sea compartida por todos los objetos de su clase.

#include <stdio.h>
 
/* function declaration */
void func(void);
 
static int count = 5; /* global variable */
 
main() {

   while(count--) {
      func();
   }
	
   return 0;
}

/* function definition */
void func( void ) {

   static int i = 5; /* local static variable */
   i++;

   printf("i is %d and count is %d\n", i, count);
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0

La clase de almacenamiento externo

los externLa clase de almacenamiento se usa para dar una referencia de una variable global que es visible para TODOS los archivos de programa. Cuando usa 'extern', la variable no se puede inicializar, sin embargo, apunta el nombre de la variable a una ubicación de almacenamiento que se ha definido previamente.

Cuando tiene varios archivos y define una variable o función global, que también se usará en otros archivos, entonces extern se usará en otro archivo para proporcionar la referencia de la variable o función definida. Solo para entender, extern se usa para declarar una variable o función global en otro archivo.

El modificador extern se usa más comúnmente cuando hay dos o más archivos que comparten las mismas variables o funciones globales, como se explica a continuación.

First File: main.c

#include <stdio.h>
 
int count ;
extern void write_extern();
 
main() {
   count = 5;
   write_extern();
}

Second File: support.c

#include <stdio.h>
 
extern int count;
 
void write_extern(void) {
   printf("count is %d\n", count);
}

Aquí, extern se usa para declarar el recuento en el segundo archivo, mientras que, como tiene su definición en el primer archivo, main.c. Ahora, compile estos dos archivos de la siguiente manera:

$gcc main.c support.c

Producirá el programa ejecutable a.out. Cuando se ejecuta este programa, produce el siguiente resultado:

count is 5