Contents
show
Storage Classes in C in Hindi
C में storage classes का उपयोग lifetime, visibility, memory location और एक variable के प्रारंभिक मूल्य को निर्धारित करने के लिए किया जाता है। C में चार तरह के स्टोरेज क्लास हैं
- Automatic
- External
- static
- Register
Storage Classes | Storage Place | Default Value | Scope | Lifetime |
auto | RAM | Garbage Value | Local | Within function |
extern | RAM | Zero | Global | मुख्य कार्यक्रम के अंत तक कार्यक्रम में कहीं भी घोषित किया जा सकता है |
static | RAM | Zero | Local | मुख्य कार्यक्रम के अंत तक, कई फ़ंक्शन कॉल के बीच retain मूल्य |
register | Register | Garbage Value | Local | Within the function |
Automatic
- Automatic variable को रनटाइम पर स्वचालित रूप से मेमोरी आवंटित की जाती है।
- Automatic variable की दृश्यता उस ब्लॉक तक सीमित है जिसमें वे परिभाषित हैं। Automatic variable का दायरा उस ब्लॉक तक सीमित है जिसमें वे परिभाषित हैं
- Automatic variable डिफ़ॉल्ट रूप से garbage के लिए आरंभिक होते हैं।
- Automatic variable को सौंपी गई मेमोरी ब्लॉक से बाहर निकलने पर मुक्त हो जाती है।
- Automatic variable को परिभाषित करने के लिए उपयोग किया जाने वाला कीवर्ड auto है।
- डिफ़ॉल्ट रूप से C में प्रत्येक loval variable स्वचालित है।
Example 1
#include <stdio.h>
int main()
{
int a; //auto
char b;
float c;
printf("%d %c %f",a,b,c); // printing initial default value of automatic variables a, b, and c.
return 0;
}
Output:
garbage garbage garbage
Example 2
#include <stdio.h>
int main()
{
int a = 10,i;
printf("%d ",++a);
{
int a = 20;
for (i=0;i<3;i++)
{
printf("%d ",a); // 20 will be printed 3 times since it is the local value of a
}
}
printf("%d ",a); // 11 will be printed since the scope of a = 20 is ended.
}
Output:
11 20 20 20 11
Static
- static specifier के रूप में परिभाषित variable कई फ़ंक्शन कॉल के बीच उनके मूल्य को पकड़ सकते हैं।
- static स्थानीय variable केवल उस फ़ंक्शन या ब्लॉक में दिखाई देते हैं जिसमें वे परिभाषित हैं।
- एक ही static variable को कई बार घोषित किया जा सकता है लेकिन इसे केवल एक ही बार में assign किया जा सकता है।
- Static integral variable का डिफ़ॉल्ट प्रारंभिक मान 0 अन्यथा शून्य है।
- Static global variable की दृश्यता उस फ़ाइल तक सीमित है जिसमें उसने घोषणा की है।
- Static variable को परिभाषित करने के लिए उपयोग किया जाने वाला कीवर्ड static है।
Example 1
#include<stdio.h>
static char c;
static int i;
static float f;
static char s[100];
void main ()
{
printf("%d %d %f %s",c,i,f); // the initial default value of c, i, and f will be printed.
}
Output:
0 0 0.000000 (null)
Example 2
#include<stdio.h>
void sum()
{
static int a = 10;
static int b = 24;
printf("%d %d \n",a,b);
a++;
b++;
}
void main()
{
int i;
for(i = 0; i< 3; i++)
{
sum(); // The static variables holds their value between multiple function calls.
}
}
Output:
10 24
11 25
12 26
Register
- रजिस्टर के रूप में परिभाषित variable को सीपीयू में मेमोरी को आवंटित किया जाता है जो सीपीयू में शेष मेमोरी के आकार पर निर्भर करता है।
- हम रजिस्टर variable को dereference नहीं कर सकते हैं, अर्थात हम रजिस्टर variable के लिए operator का उपयोग नहीं कर सकते हैं।
- रजिस्टर variable की acess समय automatic variable की तुलना में तेज है।
- रजिस्टर local variable का प्रारंभिक डिफ़ॉल्ट मान 0 है।
- रजिस्टर कीवर्ड का उपयोग उस variable के लिए किया जाता है जिसे सीपीयू रजिस्टर में संग्रहित किया जाना चाहिए। variable रजिस्टर में संग्रहीत किए जा सकते हैं।
- हम pointers को रजिस्टर में स्टोर कर सकते हैं, अर्थात, एक रजिस्टर एक variable के address को स्टोर कर सकता है।
- Static variable को रजिस्टर में संग्रहीत नहीं किया जा सकता है क्योंकि हम एक ही variable के लिए एक से अधिक स्टोरेज specifier का उपयोग नहीं कर सकते हैं।
Example 1
#include <stdio.h>
int main()
{
register int a; // variable a is allocated memory in the CPU register. The initial default value of a is 0.
printf("%d",a);
}
Output:
0
Example 2
#include <stdio.h>
int main()
{
register int a = 0;
printf("%u",&a); // This will give a compile time error since we can not access the address of a register variable.
}
Output:
main.c:5:5: error: address of register variable ?a? requested
printf(“%u”,&a);
^~~~~~
External
- External storage class का उपयोग compiler को यह बताने के लिए किया जाता है कि external के रूप में परिभाषित variable को कार्यक्रम में कहीं और external linkage के साथ घोषित किया गया है।
- extern घोषित किए गए variable को कोई मेमोरी आवंटित नहीं की जाती है। यह केवल घोषित करने के लिए है और यह निर्दिष्ट करने का indend है कि variable को कार्यक्रम में कहीं और घोषित किया गया है।
- external integral type का डिफ़ॉल्ट प्रारंभिक मान 0 अन्यथा null है।
- हम extern variable को केवल वैश्विक रूप से आरंभ कर सकते हैं, अर्थात, हम किसी भी ब्लॉक या विधि के भीतर external variable को इनिशियलाइज़ नहीं कर सकते।
- एक external variable को कई बार घोषित किया जा सकता है लेकिन इसे केवल एक बार ही आरंभ किया जा सकता है।
- यदि एक variable को external घोषित किया जाता है, तो compiler उस variable को उस कार्यक्रम में कहीं से आरंभ करने के लिए खोजता है जो external या static हो सकता है। यदि यह नहीं है, तो compiler एक error दिखाएगा।
Example 1
#include <stdio.h>
int main()
{
extern int a;
printf("%d",a);
}
Output
main.c:(.text+0x6): undefined reference to `a’
collect2: error: ld returned 1 exit status
Example 2
#include <stdio.h>
int a;
int main()
{
extern int a; // variable a is defined globally, the memory will not be allocated to a
printf("%d",a);
}
Output
0
Example 3
#include <stdio.h>
int a;
int main()
{
extern int a = 0; // this will show a compiler error since we can not use extern and initializer at same time
printf("%d",a);
}
Output
compile time error
main.c: In function ?main?:
main.c:5:16: error: ?a? has both ?extern? and initializer
extern int a = 0;
Example 4
#include <stdio.h>
int main()
{
extern int a; // Compiler will search here for a variable a defined and initialized somewhere in the pogram or not.
printf("%d",a);
}
int a = 20;
Output
20
Example 5
extern int a;
int a = 10;
#include <stdio.h>
int main()
{
printf("%d",a);
}
int a = 20; // compiler will show an error at this line
Output
compile time error