क्या संभव है?
हाँ, C में खाली स्ट्रक्चर (बिना सदस्यों वाली) घोषित करना अनुमत है। इसका आकार 0 बाइट्स होता है।
उदाहरण प्रोग्राम
#include <stdio.h>
// खाली स्ट्रक्चर
struct Empty {
// कोई सदस्य नहीं
};
int main() {
struct Empty e; // चर घोषणा
printf("खाली स्ट्रक्चर का आकार: %zu बाइट्स\n", sizeof(e));
printf("sizeof(struct Empty) = %zu\n", sizeof(struct Empty));
return 0;
}
आउटपुट
खाली स्ट्रक्चर का आकार: 0 बाइट्स sizeof(struct Empty) = 0
व्यवहार और निहितार्थ
| पहलू | व्यवहार |
|---|---|
| आकार | 0 (अधिकांश कंपाइलर में) |
| पता | वैध पता होता है, लेकिन अगला चर उसी पते पर हो सकता है |
| सरणी | struct Empty arr[10]; - आकार 0, सभी तत्व समान पता |
| पॉइंटर अंकगणित | ptr+1 == ptr (आकार 0 होने के कारण) |
| C++ में | आकार 1 बाइट होता है (खाली बेस ऑप्टिमाइजेशन के लिए) |
उपयोग के मामले
- टैग/मार्कर प्रकार: टाइप-सेफ टैगिंग के लिए
- ओपेक प्रकार (Opaque Types): हेडर में केवल घोषणा, परिभाषा .c फाइल में
- टेम्पलेट/जेनेरिक प्रोग्रामिंग: प्लेसहोल्डर के रूप में
- एलाइनमेंट/पैडिंग: संरचना में अलाइनमेंट बाध्य करना
उदाहरण: ओपेक प्रकार
// api.h - पब्लिक हेडर
struct Handle; // अपूर्ण प्रकार (incomplete type)
typedef struct Handle *Handle;
Handle create();
void destroy(Handle h);
void doSomething(Handle h);
// api.c - प्राइवेट कार्यान्वयन
struct Handle {
int fd;
char *buffer;
// वास्तविक डेटा छिपा है
};
Handle create() {
Handle h = malloc(sizeof(*h));
h->fd = open(...);
return h;
}
C vs C++ अंतर
// C
struct Empty {}; // आकार 0
Empty e1, e2;
printf("%p %p\n", &e1, &e2); // समान पता संभव
// C++
struct Empty {}; // आकार 1
Empty e1, e2;
printf("%p %p\n", &e1, &e2); // हमेशा अलग पते
C++ में प्रत्येक ऑब्जेक्ट का विशिष्ट पता होना आवश्यक है, इसलिए न्यूनतम आकार 1 बाइट होता है।
सावधानी
खाली स्ट्रक्चर की सरणी और पॉइंटर अंकगणित अप्रत्याशित व्यवहार दे सकते हैं। व्यावहारिक कोड में कम से कम एक सदस्य (जैसे char dummy;) रखना सुरक्षित है।