Problem Solving on Storage Classes and Scoping of Variables

Storage class of variables includes the scope, visibility and life-time which help to trace the existence of a particular variable during the runtime of a program. There exist four types of storage classes in C: auto, register, static and extern.

Auto and Register Storage Classes –

  • The scope of variable declared using auto or register storage class is the function or block in which variable is declared.
  • The visibility of variable is the function or block in which variable is declared.
  • The life-time of variable is the time between function/block starts executing till function/block is terminated.
  • The memory for variable in auto variables is allocated on stack.
  • Auto variable can be declared as auto int i or int i. It means default storage class of a variable declared in a function is auto.
  • Register variable can be declared as register int i. However, if register is not available, it will be given auto storage class by compiler.
  • If auto or register variable is not initialized, it contains garbage value.

Static Storage Classes –

  • The scope of variable declared using static storage class is the function or block in which variable is declared.
  • The visibility of variable is the function or block in which variable is declared.
  • The static variable remains in memory until the program is terminated. Therefore, static variable is initialized only once and value of static variable is maintained during function call.
  • The memory for auto variables is alloted in heap and memory for static variables is alloted in data segment. Please refer Memory Layout of C Programs for details.
  • Static variable can be declared as static int i.
  • If static variable is not initialized while declaration, it is initialized by default value e.g.; 0 in case of integer.

Extern Storage Classes –

  • Extern storage class is used to extend the visibility of variables where variable is defined somewhere else (in same file or different file) in the program.
  • Extern variable can be declared as extern int i. However, memory is not assigned to i as it is referencing to another variable i which is defined somewhere else in the program.

Local/Global Scope –
A variable declared inside a function or a block has its scope only in that function/block. However, a variable declared outside function has global scope which can be accessed by any function or block.
Note:



  • If a function has local/static variable with same name as global variable, local/static value is used.
  • If a function does not find a required variable in local scope, it searches the variable in global scope. If it does not find even in global scope, it will throw an error.

Que – 1. Which of the following statement about storage classes is incorrect?
(A) A variable with auto storage class has local scope in the function in which it is declared.
(B) A variable with static storage class has local scope in the function in which it is declared.
(C) A variable declaration with register storage class will return an error if register in CPU is not available.
(D) None

Solution: Option A and B are correct as auto as well as static storage class has local scope. However, option C is incorrect as register storage class is converted to auto storage class if register is not available and it will give warning not error.

Que – 2. The value of j at the end of the execution of the following C program. (GATE 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

Solution: The for loop is executed as:
For i = 0, count will be allocated memory in heap and initialized to 0. The statement count = count + i will make count = 0 + 0 = 0.
For i = 1, previous value of count is used. The statement count = count + i will make count = 0 + 1 = 1.
For i = 2, previous value of count is used. The statement count = count + i will make count = 1 + 2 = 3.
Similarly, 3 and 4 will be added to count variable for i = 3 and 4 respectively. So, answer will be 3 + 3 + 4 = 10.

Que – 3. Consider the following C program

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);
}

What output will be generated by the given code segment?
(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

Solution: The program is executed as:
Firstly, global variables a, b and c will be initialized to 0. After calling of main, static variable a in main will be initialized to 1.
When prtFun() is called first time, static variable a is initialized to 2 and local variable b is initialized to 1. The statement a+=++b can be broken into ++b followed by a = a+b. Therefore, b will be incremented to 2. Also, value be a will be 2+2 = 4. Therefore, print statement will print 4, 2. After returning from function, variable b will be destroyed (local scope) and a’s value will be preserved.

After returning from first ptrFun(), statement a+=1 will be executed and static variable a in main will be incremented to 2.
When prtFun() is called second time, local variable b is initialized to 1. The statement a+=++b can be broken into ++b followed by a = a+b. Therefore, b will be incremented to 2. Also, value be a will be = 4+2 = 6. Therefore, print statement will print 6, 2.
After returning from second prtFun(), the main function has static variable a with value 2 and global variable b with value 0. Therefore, 2, 0 is printed.
Hence, the answer is (C).

Que – 4. Consider the C function given below.

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

Which one of the following is TRUE?
(A) The function returns 0 for all values of j.
(B) The function prints the string something for all values of j.
(C) The function returns 0 when j = 50.
(D) The function will exhaust the runtime stack or run into an infinite loop when j = 50

Solution: When j is any value other than 50, if condition will fail and 0 will be returned.
When j is 50, if condition will be true and function will be called again and again. It may exhaust runtime stack or run into infinite loop.
Option (D) is correct.

Que – 5. Consider the C program shown below.

# 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();
} 

The output of this program is: (GATE CS 2003)
(A) 12 7 6
(B) 22 12 11
(C) 14 6 6
(D) 7 6 6

Solution: The variable x is declared outside main() which has global scope. Also, it is declared inside P() as well. Therefore, P() will use x local to P().
First main() will change the global x to 5.
The function P() is called by passing address of global x in y. Therefore, y contains the address of global x.
A new variable x is declared in P and initialized to *y+2 = 5+2 = 7. Therefore, local x of P() has value 7.
The function Q() is called by passing local x of P() in z. Therefore, z contains value 7.
The statement z +=x will add value of global x to z. Therefore, z =z + x = 7+5 =12 will be printed.
After returning from Q(), the statement *y = x-1 will be executed. As local x has value 7 and y refers to global x, value at global x will be 7-1 = 6. However, print(x) will print local x. therefore, 7 will be printed.
After returning from P(), the main function will print x (global value of x) which is 6. Therefore, 6 will be printed.
So, the output is (A).




This article is contributed by Sonal Tuteja. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Recommended Posts:



0 Average Difficulty : 0/5.0
No votes yet.