स्टोरेज क्लास क्या है?
स्टोरेज क्लास C में चर/फंक्शन के स्कोप (दृश्यता), जीवनकाल (लाइफटाइम), डिफ़ॉल्ट मान और मेमोरी स्थान को परिभाषित करता है।
चार स्टोरेज क्लासेस
| क्लास | कीवर्ड | स्कोप | जीवनकाल | डिफ़ॉल्ट मान | मेमोरी |
| ऑटोमैटिक | auto | ब्लॉक (लोकल) | ब्लॉक निष्पादन तक | कचरा | स्टैक |
| एक्सटर्नल | extern | पूरा प्रोग्राम (ग्लोबल) | प्रोग्राम अवधि | शून्य | डेटा सेगमेंट |
| स्टैटिक | static | ब्लॉक (लोकल) या फाइल (ग्लोबल) | प्रोग्राम अवधि | शून्य | डेटा सेगमेंट |
| रजिस्टर | register | ब्लॉक (लोकल) | ब्लॉक निष्पादन तक | कचरा | CPU रजिस्टर (संकेत) |
1. ऑटोमैटिक (auto) - डिफ़ॉल्ट लोकल
void func() {
auto int x = 10; // 'auto' वैकल्पिक, डिफ़ॉल्ट है
// x केवल इस ब्लॉक में दृश्य
}
उदाहरण: नेस्टेड ब्लॉक
#include <stdio.h>
int main() {
auto int i = 1;
{
auto int i = 2;
{
auto int i = 3;
printf("%d ", i); // 3
}
printf("%d ", i); // 2
}
printf("%d\n", i); // 1
return 0;
}
आउटपुट: 3 2 1
2. एक्सटर्नल (extern) - ग्लोबल
#include <stdio.h>
int x = 10; // ग्लोबल परिभाषा
void func() {
extern int x; // घोषणा (परिभाषा नहीं)
printf("func में x: %d\n", x);
}
int main() {
int x = 20; // लोकल x, ग्लोबल को छुपाता है
printf("main में x: %d\n", x); // 20
func(); // 10
return 0;
}
आउटपुट: main में x: 20\nfunc में x: 10
3. स्टैटिक (static)
- लोकल स्टैटिक: फंक्शन कॉल्स के बीच मान बरकरार रखता है
- ग्लोबल स्टैटिक: केवल उसी फाइल में दृश्य (इंटरनल लिंकेज)
उदाहरण: लोकल स्टैटिक
#include <stdio.h>
void counter() {
static int count = 0; // केवल पहली बार प्रारंभिकृत
count++;
printf("कॉल %d\n", count);
}
int main() {
counter(); // कॉल 1
counter(); // कॉल 2
counter(); // कॉल 3
return 0;
}
आउटपुट: कॉल 1\nकॉल 2\nकॉल 3
उदाहरण: ग्लोबल स्टैटिक
// file1.c
static int privateVar = 42; // अन्य फाइल्स से अदृश्य
// file2.c
extern int privateVar; // लिंकर त्रुटि: undefined reference
4. रजिस्टर (register)
- कंपाइलर को सुझाव: चर को CPU रजिस्टर में रखें (तेज एक्सेस)
- पता नहीं ले सकते:
&var अवैध
- आधुनिक कंपाइलर स्वयं अनुकूलन करते हैं;
register केवल संकेत है
- लूप काउंटर, बार-बार उपयोग होने वाले चर के लिए
उदाहरण
#include <stdio.h>
int main() {
register int i;
for (i = 1; i <= 5; i++)
printf("%d ", i);
// printf("%p", &i); // त्रुटि: रजिस्टर चर का पता नहीं ले सकते
return 0;
}
आउटपुट: 1 2 3 4 5
सारांश: कब क्या उपयोग करें?
- auto: सामान्य लोकल चर (डिफ़ॉल्ट, कीवर्ड वैकल्पिक)
- static: फंक्शन कॉल्स के बीच राज्य बनाए रखने, फाइल-प्राइवेट ग्लोबल
- extern: बहु-फाइल प्रोजेक्ट में ग्लोबल चर/फंक्शन साझा करना
- register: प्रदर्शन-महत्वपूर्ण लूप काउंटर (कंपाइलर पर छोड़ें)
स्टोरेज क्लास स्पेसिफायर्स के साथ फंक्शन्स
| घोषणा | अर्थ |
static void f() | फाइल-प्राइवेट फंक्शन |
extern void f() | ग्लोबल फंक्शन (डिफ़ॉल्ट) |
inline void f() | इनलाइन सुझाव (C99) |