Structure vs Union
Structure और union: मूल विचार
struct और union दोनों अलग-अलग data types को एक नाम के नीचे group करते हैं। Code में ये लगभग एक जैसे दिखते भी हैं। जो एक अंतर सब कुछ बदल देता है वह है — ये memory कैसे इस्तेमाल करते हैं:
- Structure हर member को अलग memory देता है। सभी members एक साथ रहते हैं।
- Union सभी members को एक ही memory में रखता है। एक समय केवल एक member सही होता है।
यह समझ जाने पर बाकी हर अंतर — size, व्यवहार और उपयोग — अपने आप स्पष्ट हो जाता है।
Structure memory कैसे रखता है
Structure में member a एक जगह होता है, member b दूसरी जगह। ये कभी overlap नहीं करते।
#include <stdio.h>
struct Data {
int a; // अपने 4 bytes
char b; // अपना 1 byte
};
int main() {
struct Data d;
d.a = 65;
d.b = 'X';
printf("a = %d, b = %c\n", d.a, d.b); // दोनों बचे रहते हैं
printf("size = %lu bytes\n", sizeof(d));
return 0;
}a = 65, b = X
size = 8 bytes
a और b दोनों एक साथ अपनी values रखते हैं, क्योंकि हर एक की अलग memory है। (Size 5 नहीं बल्कि 8 है, क्योंकि compiler alignment के लिए padding जोड़ता है।)
Union memory कैसे रखता है
अब वही members एक union में। ये एक memory space साझा करते हैं, इसलिए एक में लिखने से दूसरा overwrite हो जाता है।
#include <stdio.h>
union Data {
int a; // वही memory साझा
char b; // वही memory साझा
};
int main() {
union Data d;
d.a = 65;
printf("a = %d\n", d.a);
d.b = 'X'; // a की memory overwrite
printf("b = %c\n", d.b);
printf("ab a = %d\n", d.a); // a बिगड़ गया
printf("size = %lu bytes\n", sizeof(d));
return 0;
}a = 65
b = X
ab a = 88
size = 4 bytes
देखा कैसे b = 'X' set करने के बाद a बदलकर 88 हो गया? क्योंकि 'X' का ASCII 88 है, जो उन्हीं bytes में लिखा गया। Union में जो member आपने आख़िरी बार लिखा, केवल वही सही होता है।
sizeof अलग क्यों आता है
यह पसंदीदा interview सवाल है। Structure को 8 bytes चाहिए थे (4 int + 1 char + 3 padding)। Union को सिर्फ़ 4 bytes चाहिए — बस अपने सबसे बड़े member (int) जितने। Char उसी space का हिस्सा दोबारा इस्तेमाल करता है।
Structure size ≈ सभी members का जोड़ (+ padding)। Union size = सबसे बड़े member का size।
Union का असली उपयोग
Union तब चमकता है जब कोई value कई types में से एक हो सकती हो, पर एक समय केवल एक। मान लीजिए एक setting जो या तो number है या letter grade — कभी दोनों नहीं:
#include <stdio.h>
struct Result {
int isLetter; // छोटा "tag"
union {
int marks; // जब isLetter == 0
char grade; // जब isLetter == 1
} value;
};
int main() {
struct Result r;
r.isLetter = 0;
r.value.marks = 92;
if (r.isLetter) printf("Grade: %c\n", r.value.grade);
else printf("Marks: %d\n", r.value.marks);
return 0;
}Marks: 92
छोटा isLetter tag याद रखता है कि अभी कौन सा member सही है — यह आम और सुरक्षित pattern "tagged union" कहलाता है।
Structure बनाम union: पूरी तुलना
| बिंदु | Structure | Union |
|---|---|---|
| Memory | हर member की अलग | सभी members साझा |
| Active members | सभी एक साथ | एक समय एक |
| Size | members का जोड़ (+ padding) | सबसे बड़ा member |
| एक member लिखने पर | बाकी अप्रभावित | बाकी overwrite |
| Keyword | struct | union |
| किसके लिए बेहतर | कई fields वाले records | कई में से एक type की value |
कब कौन सा इस्तेमाल करें
- Structure तब जब आपको कई data एक साथ रखने हों — जैसे किसी student का नाम, roll number और marks।
- Union तब जब value कई types में से एक हो पर एक समय एक ही, और आप memory बचाना चाहें।
आम गलतियाँ
- ऐसा union member पढ़ना जो आपने आख़िरी बार नहीं लिखा — garbage या पुनर्व्याख्या मिलती है, पुरानी value नहीं।
- यह उम्मीद करना कि सभी union members structure की तरह एक साथ data रखेंगे।
- यह भूलना कि structure size में padding जुड़ता है, इसलिए वह अक्सर सीधे जोड़ से बड़ा होता है।
- जब सभी fields चाहिए तब "memory बचाने" के लिए union इस्तेमाल करना — इससे data बिगड़ता है।
एक union बनाएँ जिसमें int, float और char हों। sizeof print करके पुष्टि करें कि वह सबसे बड़े member के बराबर है। फिर हर member बारी-बारी लिखें और देखें कि पिछला कैसे बदलता है।
सारांश
- Structure = हर member की अलग memory; सभी members एक साथ इस्तेमाल।
- Union = साझा memory; केवल आख़िरी लिखा member सही होता है।
- Structure size = members का जोड़ (+ padding); union size = सबसे बड़ा member।
- Records के लिए structure; memory बचाने वाली एक-में-से-कई-type value के लिए union।