Clases de almacenamiento en C

Clases de almacenamiento en C

En lenguaje C, cada variable tiene una clase de almacenamiento que decide lo siguiente:

  • alcance es decir, donde el valor de la variable estaría disponible dentro de un programa.
  • valor inicial predeterminado es decir, si no inicializamos explícitamente esa variable, ¿cuál será su valor inicial predeterminado?
  • de por vida de esa variable, es decir, por cuánto tiempo existirá esa variable.

Las siguientes clases de almacenamiento se utilizan con mayor frecuencia en la programación C,

  1. Variables automáticas
  2. Variables externas
  3. Variables estáticas
  4. Registrar variables

Variables automáticas:auto

Alcance: Variable definida con auto clase de almacenamiento son locales para el bloque de funciones dentro del cual están definidas.

Valor inicial predeterminado: Cualquier valor aleatorio, es decir, valor de basura.

Vida útil: Hasta el final del bloque de función/método donde se define la variable.

Una variable declarada dentro de una función sin ninguna especificación de clase de almacenamiento, es por defecto una variable automática . Se crean cuando se llama a una función y se destruyen automáticamente cuando se completa la ejecución de la función. Las variables automáticas también se pueden llamar variables locales porque son locales a una función. Por defecto se les asigna valor basura por el compilador.

#include<stdio.h>
    
void main()
{
    int detail;
    // or 
    auto int details;    //Both are same
}

Variable externa o global

Alcance: Global, es decir, en todas partes del programa. Estas variables no están vinculadas a ninguna función, están disponibles en todas partes.

Valor inicial predeterminado: 0 (cero).

Vida útil: Hasta que el programa no termine su ejecución, puede acceder a las variables globales.

Una variable que se declara fuera de cualquier función es una Variable global . Las variables globales permanecen disponibles durante la ejecución del programa. De forma predeterminada, el valor inicial de la variable global es 0 (cero). Una cosa importante para recordar acerca de la variable global es que sus valores pueden ser cambiados por cualquier función en el programa.

#include<stdio.h>

int number;     // global variable

void main()
{
    number = 10;
    printf("I am in main function. My value is %d\n", number);
    fun1();     //function calling, discussed in next topic
    fun2();     //function calling, discussed in next topic
}

/* This is function 1 */
fun1()
{
    number = 20;
    printf("I am in function fun1. My value is %d", number);
}
/* This is function 1 */
fun2()
{
    printf("\nI am in function fun2. My value is %d", number);
}

Estoy en función principal. Mi valor es 10Estoy en funcion fun1. Mi valor es 20Estoy en funcion fun2. Mi valor es 20

Aquí la variable global number está disponible para las tres funciones y, por lo tanto, si una función cambia el valor de la variable, se cambia en todas las funciones.

Nota: Declarar la clase de almacenamiento como global o externa para todas las variables en un programa puede desperdiciar mucho espacio de memoria porque estas variables tienen una vida útil hasta el final del programa. Por lo tanto, las variables, que no se necesitan hasta el final del programa, seguirán ocupando la memoria y, por lo tanto, se desperdiciará memoria.

extern palabra clave

El extern La palabra clave se usa con una variable para informar al compilador que esta variable está declarada en otro lugar. El extern declaración no asigna almacenamiento para variables.


Problema cuando no se usa externo

int main()
{
    a = 10;     //Error: cannot find definition of variable 'a'
    printf("%d", a);    
}

Ejemplo usando extern en el mismo archivo

int main()
{
    extern int x;   //informs the compiler that it is defined somewhere else
    x = 10;      
    printf("%d", x);    
}
int x;      //Global variable x

Variables estáticas

Alcance: Local al bloque en el que se define la variable

Valor inicial predeterminado: 0 (cero).

Vida útil: Hasta que todo el programa no termina su ejecución.

Un static variable le dice al compilador que persista/guarde la variable hasta el final del programa. En lugar de crear y destruir una variable cada vez que entra y sale del alcance, static La variable se inicializa solo una vez y permanece hasta el final del programa. Un static variable puede ser interna o externa dependiendo del lugar de declaración. Alcance de la estática interna variable permanece dentro de la función en la que está definida. Estático externo las variables permanecen restringidas al alcance del archivo en el que se declaran.

Se les asigna 0 (cero) como valor predeterminado por el compilador.

#include<stdio.h>

void test();    //Function declaration (discussed in next topic)
 
int main()
{
    test();
    test();
    test();
}

void test()
{
    static int a = 0;       //a static variable
    a = a + 1;
    printf("%d\t",a);
}

1 2 3

Registrar variable

Alcance: Local a la función en la que se declara.

Valor inicial predeterminado: Cualquier valor aleatorio, es decir, valor de basura

Vida útil: Hasta el final del bloque de función/método, en el que se define la variable.

Las variables de registro informan al compilador que almacene la variable en el registro de la CPU en lugar de la memoria. Las variables de registro tienen una accesibilidad más rápida que una variable normal. Generalmente, las variables de uso frecuente se mantienen en registros. Pero solo unas pocas variables se pueden colocar dentro de los registros. Una aplicación de la clase de almacenamiento de registros puede ser el uso de bucles, donde la variable se usa varias veces en el programa, en un lapso de tiempo muy corto.

NOTA: Nunca podemos obtener la dirección de dichas variables.

Sintaxis:

register int number;

Nota: Aunque hemos declarado la clase de almacenamiento de nuestra variable number como registro, no podemos decir con seguridad que el valor de la variable se almacenaría en un registro. Esto se debe a que la cantidad de registros en una CPU es limitada. Además, los registros de la CPU están destinados a realizar una gran cantidad de trabajo importante. Por lo tanto, a veces pueden no ser gratuitos. En tal escenario, la variable funciona como si su clase de almacenamiento fuera auto .

Qué clase de almacenamiento se debe usar y cuándo

Para mejorar la velocidad de ejecución del programa y utilizar con cuidado el espacio de memoria ocupado por las variables, se deben tener en cuenta los siguientes puntos al utilizar las clases de almacenamiento:

  • Deberíamos usar static clase de almacenamiento solo cuando queremos que el valor de la variable permanezca igual cada vez que la llamamos usando diferentes llamadas a funciones.
  • Deberíamos usar register clase de almacenamiento solo para aquellas variables que se usan en nuestro programa con mucha frecuencia. Los registros de la CPU son limitados y, por lo tanto, deben usarse con cuidado.
  • Deberíamos usar una clase de almacenamiento externo o global solo para aquellas variables que están siendo utilizadas por casi todas las funciones del programa.
  • Si no tenemos el propósito de ninguna de las clases de almacenamiento mencionadas anteriormente, entonces debemos usar la clase de almacenamiento automático.