Clases de almacenamiento en C: automático, externo, estático, registro (ejemplos)

⚡ Resumen inteligente

En C, las clases de almacenamiento definen el alcance, el tiempo de vida, el valor predeterminado y la ubicación en memoria de cada variable, utilizando cuatro especificadores (auto, register, static y extern) para controlar dónde residen los datos y cuánto tiempo permanecen durante la ejecución.

  • 🗂️ Cuatro clases de almacenamiento: C proporciona especificadores auto, register, static y extern para describir cada variable.
  • 🏠 Coches: La clase local predeterminada, confinada a su bloque y que contiene un valor basura hasta que se le asigna un valor.
  • ⚡ Regístrate Solicita almacenamiento en los registros de la CPU para un acceso más rápido a variables de uso frecuente, como los contadores.
  • ♻️ Estática: Conserva el valor de una variable entre llamadas a la función y, por defecto, se establece en cero la primera vez que se usa.
  • 🌐 externo: Comparte una variable o función global entre varios archivos fuente sin necesidad de redefinirla.
  • 📊 Alcance y duración: Cada clase determina dónde es visible una variable y cuánto tiempo permanece activa.

Clases de almacenamiento en C

¿Qué es la clase de almacenamiento en C?

Una clase de almacenamiento representa la visibilidad y la ubicación de una variable. Indica desde qué parte del código podemos acceder a una variable. Una clase de almacenamiento en C se utiliza para describir lo siguiente:

  • El alcance variable.
  • La ubicación donde se almacenará la variable.
  • El valor inicializado de una variable.
  • Toda la vida de una variable.
  • ¿Quién puede acceder a una variable?

Por tanto, se utiliza una clase de almacenamiento para representar la información sobre una variable.

NOTA: Una variable no solo está asociada con una tipo de datos, su valor pero también una clase de almacenamiento.

¿Cuáles son los tipos de clases de almacenamiento en C?

Hay un total de cuatro tipos de clases de almacenamiento estándar. La siguiente tabla representa las clases de almacenamiento en C.

Clase de almacenamiento Propósito
auto Es una clase de almacenamiento predeterminada.
externo Es una variable global.
estático Es una variable local que es capaz de devolver un valor incluso cuando el control se transfiere a la llamada de función.
Registro Es una variable que se almacena dentro de un Registro.

Clase de almacenamiento automático en C

Las variables definidas utilizando la clase de almacenamiento automático se denominan variables locales. Auto significa clase de almacenamiento automático. Una variable está en la clase de almacenamiento automático de forma predeterminada si no se especifica explícitamente.

El alcance de una variable automática está limitado únicamente al bloque particular. Una vez que el control sale del bloque, el acceso queda destruido. Esto significa que sólo el bloque en el que se declara la variable automática puede acceder a ella.

Se utiliza una palabra clave auto para definir una clase de almacenamiento automático. De forma predeterminada, una variable automática contiene un valor basura.

Example, auto int age;

El siguiente programa define una función con dos variables locales.

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

Tomamos otro programa que muestra el nivel de alcance "nivel de visibilidad" para las variables automáticas en cada código de bloque que son independientes entre sí:

#include <stdio.h>
int main( )
{
  auto int j = 1;
  {
    auto int j= 2;
    {
      auto int j = 3;
      printf ( " %d ", j);
    }
    printf ( "\t %d ",j);
  }
  printf( "%d\n", j);}

Salida:

 3 2 1

Clase de almacenamiento externo en C

Extern significa clase de almacenamiento externo. La clase de almacenamiento externo se utiliza cuando tenemos funciones o variables globales que se comparten entre dos o más archivos.

La palabra clave extern se utiliza para declarar una variable o función global en otro archivo, proporcionando así la referencia a la variable o función que ya ha sido definida en el archivo original.

Las variables definidas mediante una palabra clave externa se denominan variables globales. Estas variables son accesibles a lo largo del programa. Tenga en cuenta que la variable externa no se puede inicializar; ya se ha definido en el archivo original.

Example, extern void display();

Primer archivo: main.c

#include <stdio.h>
extern i;
main() {
   printf("value of the external integer is = %d\n", i);
   return 0;}

Segundo archivo: original.c

#include <stdio.h>
i=48;

Resultado:

 value of the external integer is = 48

Para compilar y ejecutar el código anterior, siga los pasos a continuación

Paso 1) Crear un nuevo proyecto,

  • Seleccionar aplicación de consola
  • Haga clic en Ir

Crear nuevo proyecto en Code Bloques

Paso 2) Seleccione C y haga clic en Siguiente

Seleccione el lenguaje C.

Paso 3) Haga clic en Siguiente

Haga clic en Siguiente

Paso 4) Introduzca los datos y haga clic en Siguiente.

Introduzca los detalles del proyecto

Paso 5) Haga clic en Finalizar

Haga clic en Finalizar

Paso 6) Coloque el código principal como se muestra en el programa anterior en el archivo main.c y guárdelo.

Agregue el código a main.c

Paso 7) Cree un nuevo archivo C [Archivo -> Nuevo -> Archivo vacío], guárdelo (como original.c) y agréguelo al proyecto actual haciendo clic en “Aceptar” en el cuadro de diálogo.

Crear archivo original.c

Paso 8) Coloque y guarde el código C del archivo original.c que se muestra en el ejemplo anterior sin la función main().

Agregue el código a original.c

Paso 9) Compile y ejecute su proyecto. El resultado se muestra en la siguiente figura.

Salida del programa

Clase de almacenamiento estático en C

Las variables estáticas se utilizan dentro de la función/archivo como variables estáticas locales. También se pueden utilizar como variable global

  • La variable local estática es una variable local que retiene y almacena su valor entre llamadas a funciones o bloques y permanece visible solo para la función o bloque en el que está definida.
  • Las variables globales estáticas son variables globales visibles únicamente para el archivo en el que se declaran.
Example: static int count = 10;

Tenga en cuenta que la variable estática tiene un valor inicial predeterminado cero y se inicializa solo una vez en su vida.

#include <stdio.h> /* function declaration */
void next(void);
static int counter = 7; /* global variable */
main() {
 while(counter<10) {
      next();
      counter++;   }
return 0;}
void next( void ) {    /* function definition */
   static int iteration = 13; /* local static variable */
   iteration ++;
   printf("iteration=%d and counter= %d\n", iteration, counter);}

Resultado:

iteration=14 and counter= 7
iteration=15 and counter= 8
iteration=16 and counter= 9

Se puede acceder a las variables globales en todo el archivo, mientras que a las variables estáticas solo se puede acceder a una parte particular de un código.

La vida útil de una variable estática se encuentra en todo el código del programa. Una variable que se declara o inicializa utilizando una palabra clave estática siempre contiene cero como valor predeterminado.

Registrar clase de almacenamiento en C

Puede utilizar la clase de almacenamiento de registros cuando desee almacenar variables locales dentro de funciones o bloques en registros de la CPU en lugar de RAM para tener acceso rápido a estas variables. Por ejemplo, los “contadores” son buenos candidatos para almacenarse en el registro.

Example: register int age;

La palabra clave `register` se utiliza para declarar una clase de almacenamiento de registros. Las variables declaradas mediante la clase de almacenamiento `register` tienen una vida útil durante todo el programa.

Es similar a la clase de almacenamiento automático. La variable está limitada al bloque particular. La única diferencia es que las variables declaradas utilizando la clase de almacenamiento de registros se almacenan dentro de los registros de la CPU en lugar de en una memoria. El registro tiene un acceso más rápido que el de la memoria principal.

Las variables declaradas mediante la clase de almacenamiento de registros no tienen ningún valor predeterminado. Estas variables suelen declararse al comienzo de un programa.

#include <stdio.h> /* function declaration */
main() {
{register int  weight;
int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}
}

Salida:

error: address of register variable 'weight' requested

La siguiente tabla resume las características principales de cada clase de almacenamiento que se usan comúnmente en la programación en C.

Clase de almacenamiento Declaración Almacenaje Valor inicial predeterminado <b></b><b></b> Dura toda la vida
auto Dentro de una función/bloque Salud Cerebral Imprevisible Dentro de la función/bloque Dentro de la función/bloque
Registro Dentro de una función/bloque Registros de CPU Basura Dentro de la función/bloque Dentro de la función/bloque
externo Fuera de todas las funciones Salud Cerebral Cero Completar el archivo y otros archivos donde la variable se declara como externa tiempo de ejecución del programa
Estático (local) Dentro de una función/bloque Salud Cerebral Cero Dentro de la función/bloque tiempo de ejecución del programa
Estático (global) Fuera de todas las funciones Salud Cerebral Cero Global tiempo de ejecución del programa

Preguntas Frecuentes

El ámbito determina dónde es visible una variable en el código, mientras que su tiempo de vida determina cuánto tiempo permanece en la memoria. Una variable puede tener ámbito de bloque y, sin embargo, un tiempo de vida que abarque todo el programa.

Ambos crean variables locales con ámbito de bloque, pero auto las mantiene en memoria con un valor predeterminado de basura, mientras que register solicita un almacenamiento más rápido en los registros de la CPU y prohíbe tomar la dirección de la variable.

No. register es solo una solicitud; el compilador puede ignorarla cuando no hay ningún registro libre. Los compiladores modernos optimizan automáticamente el uso de registros, por lo que la palabra clave rara vez es necesaria.

Las variables estáticas y externas residen en un segmento de memoria inicializado a cero durante todo el programa, por lo que comienzan en cero. Las variables automáticas reutilizan la memoria de la pila, mantienenping cualquier valor que haya quedado.

Una declaración extern solo anuncia una variable definida en otro lugar y no puede inicializarse. La definición real, en un archivo, asigna el espacio de almacenamiento, y el enlace conecta todas las referencias a ella.

En su mayoría, pero no exactamente. C++ Se ha dejado de usar la palabra clave register y se ha reutilizado auto para la inferencia de tipos. static y extern se comportan de forma similar, aunque C++ agrega reglas de almacenamiento thread_local y class-member.

Sí. Los asistentes de IA describen auto, register, static y extern, sugieren el especificador correcto para cada variable y señalan el uso indebido, como tomar la dirección de una variable de registro.

Copiloto de GitHub Completa automáticamente los contadores estáticos, las declaraciones extern en diferentes archivos y las sugerencias de registro, y luego explica el alcance y el tiempo de vida en línea mientras escribes.

Resumir este post con: