Storage Classes in C
Storage Classes in C
Storage Classes are used to define the variable and function property. These functionalities include basically the scope, accessibility, and lifetime that help us detect the existence of a particular variable during a program's runtime.
- auto
- register
- static
- extern
The auto Storage Class
For all local variables, the auto storage class is the default storage class.
{ ………… ………… auto int gender; }
The example above differentiates two variables in the same storage class.
Only functions, i.e., local variables, can be used in 'auto'
The static Storage Class
The static storage class instructs the compiler to retain a local variable in existence throughout the program's lifespan, instead of generating it and deleting it as it comes in and goes out of control. Hence, the stratification of local variables helps maintain their values between function calls.
Also, the static modifier may be applied to global variables. When this is achieved, it causes the scope of that variable to be limited to the file that declares it to be in.
The register Storage Class
This class of storage declares registry variables that have the same functionality like the auto variables. The only difference is that if a free register is available, the compiler tries to store those variables in the microprocessor's register. It makes use of registry variables much faster than those stored in the memory during the initialization of the program. If there is no free register available, these are stored only in the memory. Generally, several variables are defined with the register keyword, which helps in increasing the system runtime to be obtained within a program. An important and interesting point to note here is that we cannot use the pointers to retrieve the address of a registry variable.
register int token;
In C programming language, when static has been used on a global variable, it allows all members of its class to share only one copy of that item.
#include <stdio.h> /* function declaration */ void function(void); static int count = 10; /* global variable */ main() { while(count--) { function(); } return 0; } /* function definition */ void function( void ) { static int k = 10; /* local static variable */ k++; printf("k is %d and count is %d\n", k, count); }
Output:
The extern Storage Class
The extern storage class is used to provide a comparison of a global variable that is accessible to ALL the files in the program. However, when you use 'external,' the variable cannot be initialized; it points the name of the variable to a predefined storage location.
Example:
#include <stdio.h> int x; void autoStorageClass() { printf("\nDemonstrating auto class\n\n"); // declaring an auto variable (simply // writing "int k=30;" works as well) auto int k = 30; // printing the auto variable 'a' printf("Value of the variable 'k'" " declared as auto: %d\n", k); printf("--------------------------------"); } void registerStorageClass() { printf("\nDemonstrating register class\n\n"); // declaring a register variable register char b = 'G'; // printing the register variable 'b' printf("Value of the variable 'b'" " declared as register: %d\n", b); printf("--------------------------------"); } void externStorageClass() { printf("\nDemonstrating extern class\n\n"); // telling the compiler that the variable // z is an extern variable and has been // defined elsewhere (above the main // function) extern int x; // printing the extern variables 'x' printf("Value of the variable 'x'" " declared as extern: %d\n", x); // value of extern variable x modified x = 2; // printing the modified values of // extern variables 'x' printf("Modified value of the variable 'x'" " declared as extern: %d\n", x); printf("--------------------------------"); } void staticStorageClass() { int t = 0; printf("\nDemonstrating static class\n\n"); // using a static variable 'y' printf("Declaring 'y' as static inside the loop.\n" "But this declaration will occur only" " once as 'y' is static.\n" "If not, then every time the value of 'y' " "will be the declared value 5" " as in the case of variable 'p'\n"); printf("\nLoop started:\n"); for (t = 1; t < 5; t++) { // Declaring the static variable 'y' static int y = 5; // Declare a non-static variable 'p' int p = 10; // Incrementing the value of y and p by 1 y++; p++; // printing value of y at each iteration printf("\nThe value of 'y', " "declared as static, in %d " "iteration is %d\n", t, y); // printing value of p at each iteration printf("The value of non-static variable 'p', " "in %d iteration is %d\n", t, p); } printf("\nLoop ended:\n"); printf("--------------------------------"); } int main() { printf("A program to demonstrate." " Storage Classes in C\n\n"); // To demonstrate auto Storage Class autoStorageClass(); // To demonstrate register Storage Class registerStorageClass(); // To demonstrate extern Storage Class externStorageClass(); // To demonstrate static Storage Class staticStorageClass(); // exiting printf("\n\nStorage Classes demonstrated"); return 0; }
Output: