Resolución de problemas sobre clases de almacenamiento y alcance de variables

La clase de almacenamiento de variables incluye el alcance, la visibilidad y el tiempo de vida que ayudan a rastrear la existencia de una variable particular durante el tiempo de ejecución de un programa. Existen cuatro tipos de clases de almacenamiento en C : automático, registro, estático y externo. 

Clases de almacenamiento automático y de registro:

  • El alcance de la variable declarada mediante la clase de almacenamiento auto o register es la función o el bloque en el que se declara la variable.
  • La visibilidad de la variable es la función o el bloque en el que se declara la variable.
  • El tiempo de vida de la variable es el tiempo entre que la función/bloque comienza a ejecutarse hasta que finaliza la función/bloque.
  • La memoria para variable en variables automáticas se asigna en la pila.
  • La variable automática se puede declarar como auto int i o int i. Significa que la clase de almacenamiento predeterminada de una variable declarada en una función es automática.
  • La variable de registro se puede declarar como registro int i. Sin embargo, si el registro no está disponible, el compilador le otorgará una clase de almacenamiento automático.
  • Si la variable automática o de registro no se inicializa, contiene valor de basura.

Clases de almacenamiento estático:

  • El alcance de la variable declarada mediante la clase de almacenamiento estático es la función o el bloque en el que se declara la variable.
  • La visibilidad de la variable es la función o el bloque en el que se declara la variable.
  • La variable estática permanece en la memoria hasta que finaliza el programa. Por lo tanto, la variable estática se inicializa solo una vez y el valor de la variable estática se mantiene durante la llamada a la función.
  • La memoria para las variables automáticas se asigna en el montón y la memoria para las variables estáticas se asigna en el segmento de datos. Consulte Diseño de memoria de programas C para obtener más detalles.
  • La variable estática se puede declarar como static int i.
  • Si la variable estática no se inicializa durante la declaración, se inicializa por valor predeterminado, por ejemplo; 0 en caso de número entero.

Clases de almacenamiento externo:

  • La clase de almacenamiento externo se usa para ampliar la visibilidad de las variables donde la variable se define en otro lugar (en el mismo archivo o en un archivo diferente) en el programa.
  • La variable externa se puede declarar como extern int i. Sin embargo, la memoria no se asigna a i ya que hace referencia a otra variable i que se define en otra parte del programa.

Alcance local/global: una variable declarada dentro de una función o un bloque tiene su alcance solo en esa función/bloque. Sin embargo, una variable declarada fuera de la función tiene un alcance global al que puede acceder cualquier función o bloque. 

Nota:

  • Si una función tiene una variable local/estática con el mismo nombre que la variable global, se usa el valor local/estático.
  • Si una función no encuentra una variable requerida en el ámbito local, busca la variable en el ámbito global. Si no encuentra ni siquiera en el alcance global, arrojará un error.

Que – 1. ¿Cuál de las siguientes afirmaciones sobre las clases de almacenamiento es incorrecta? (A) Una variable con clase de almacenamiento automático tiene alcance local en la función en la que se declara. (B) Una variable con clase de almacenamiento estático tiene alcance local en la función en la que se declara. (C) Una declaración de variable con clase de almacenamiento de registro devolverá un error si el registro en la CPU no está disponible. (D) Ninguno 

Solución: las opciones A y B son correctas, ya que la clase de almacenamiento automático y estático tiene alcance local. Sin embargo, la opción C es incorrecta ya que la clase de almacenamiento de registro se convierte en clase de almacenamiento automático si el registro no está disponible y dará una advertencia, no un error. 

Que – 2. El valor de j al final de la ejecución del siguiente programa en C. (PUERTA CS 2000)

int incr (int i)
{
   static int count = 0;
   count = count + i;
   return (count);
}
main ()
{
   int i, j;
   for (i = 0; i <=4; i++)
      j = incr(i);
}

(A) 10 (B) 4 (C) 6 (D) 7 

Solución: El ciclo for se ejecuta como: Para i = 0, el conteo se asignará a la memoria en el montón y se inicializará en 0. La instrucción conteo = conteo + i hará el conteo = 0 + 0 = 0. Para i = 1, el valor anterior de cuenta se utiliza. La declaración cuenta = cuenta + i hará cuenta = 0 + 1 = 1. Para i = 2, se usa el valor anterior de cuenta. La declaración contar = contar + i hará contar = 1 + 2 = 3. De manera similar, 3 y 4 se agregarán a la variable de recuento para i = 3 y 4 respectivamente. Entonces, la respuesta será 3 + 3 + 4 = 10. 

Que – 3. Considere el siguiente programa en C

int a, b, c = 0;
void prtFun (void);
int main ()
{
    static int a = 1; /* line 1 */
    prtFun();
    a += 1;
    prtFun();
    printf ( "\n %d %d ", a, b) ;
}
 
void prtFun (void)
{
    static int a = 2; /* line 2 */
    int b = 1;
    a += ++b;
    printf (" \n %d %d ", a, b);
}

¿Qué salida generará el segmento de código dado? (A)

3 1
4 1
4 2

(B)

4 2
6 1
6 1

(C)

4 2
6 2
2 0

(D)

3 1
5 2
5 2

Solución:El programa se ejecuta como: En primer lugar, las variables globales a, b y c se inicializarán a 0. Después de llamar a main, la variable estática a en main se inicializará a 1. Cuando se llama a prtFun() por primera vez, la variable estática a es se inicializa en 2 y la variable local b se inicializa en 1. La instrucción a+=++b se puede dividir en ++b seguida de a = a+b. Por lo tanto, b se incrementará a 2. Además, el valor de a será 2+2 = 4. Por lo tanto, la declaración de impresión imprimirá 4, 2. Después de regresar de la función, la variable b se destruirá (alcance local) y el valor de a ser preservado. Después de regresar del primer ptrFun(), se ejecutará la declaración a+=1 y la variable estática a en main se incrementará a 2. Cuando se llama a prtFun() por segunda vez, la variable local b se inicializa a 1. La declaración a+=++ b se puede dividir en ++b seguido de a = a+b. Por lo tanto, b se incrementará a 2. Además, el valor de a será = 4+2 = 6. Por lo tanto, la declaración de impresión imprimirá 6, 2. Después de regresar del segundo prtFun(), la función principal tiene una variable estática a con valor 2 y variable global b con valor 0. Por lo tanto, se imprime 2, 0. Por lo tanto, la respuesta es (C). 

Que – 4. Considere la función C dada a continuación.

int f(int j)
{
  static int i = 50;
  int k;
  if (i == j)
  {
    printf("something");
    k = f(i);
    return 0;
  }
  else return 0;
}

¿Cuál de las siguientes es VERDADERA? (A) La función devuelve 0 para todos los valores de j. (B) La función imprime la string algo para todos los valores de j. (C) La función devuelve 0 cuando j = 50. (D) La función agotará la pila de tiempo de ejecución o entrará en un ciclo infinito cuando j = 50 

Solución: cuando j es cualquier valor que no sea 50, si la condición fallará y se devolverá 0. Cuando j es 50, si la condición será verdadera y la función se llamará una y otra vez. Puede agotar la pila de tiempo de ejecución o entrar en un bucle infinito. La opción (D) es correcta. 

Que – 5. Considere el programa en C que se muestra a continuación.

# include <stdio.h> 
# define print(x)  printf ("%d", x) 
int x; 
void Q(int z) 
{ 
  z += x;
  print(z); 
} 
void P(int *y) 
{ 
  int x = *y+2; 
  Q(x); 
  *y = x-1; 
  print(x);
} 
 
main(void) 
{ 
  x = 5; 
  P(&x); 
  print(x); 
  getchar();
} 

El resultado de este programa es: (GATE CS 2003) (A) 12 7 6 (B) 22 12 11 (C) 14 6 6 (D) 7 6 6 

Solución:La variable x se declara fuera de main() que tiene alcance global. Además, también se declara dentro de P(). Por lo tanto, P() usará x local a P(). Primero main() cambiará la x global a 5. La función P() se llama pasando la dirección de la x global en y. Por lo tanto, y contiene la dirección de x global. Una nueva variable x se declara en P y se inicializa a *y+2 = 5+2 = 7. Por lo tanto, la x local de P() tiene el valor 7. La función Q() se llama pasando la x local de P() en z. Por lo tanto, z contiene el valor 7. La declaración z +=x agregará el valor de x global a z. Por lo tanto, se imprimirá z =z + x = 7+5 =12. Después de regresar de Q(), se ejecutará la sentencia *y = x-1. Como x local tiene el valor 7 e y se refiere a x global, el valor en x global será 7-1 = 6. Sin embargo, print(x) imprimirá x local. por lo tanto, se imprimirá 7. Después de regresar de P(), la función principal imprimirá x (valor global de x) que es 6. Por lo tanto, se imprimirá 6. Entonces, la salida es (A).

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *