📘 Lesson  ·  Lesson 58

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 नहीं करते।

C Language
#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;
}
Output:
a = 65, b = X
size = 8 bytes

a और b दोनों एक साथ अपनी values रखते हैं, क्योंकि हर एक की अलग memory है। (Size 5 नहीं बल्कि 8 है, क्योंकि compiler alignment के लिए padding जोड़ता है।)

Union memory कैसे रखता है

अब वही members एक union में। ये एक memory space साझा करते हैं, इसलिए एक में लिखने से दूसरा overwrite हो जाता है।

C Language
#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;
}
Output:
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 — कभी दोनों नहीं:

C Language
#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;
}
Output:
Marks: 92

छोटा isLetter tag याद रखता है कि अभी कौन सा member सही है — यह आम और सुरक्षित pattern "tagged union" कहलाता है।

Structure बनाम union: पूरी तुलना

बिंदुStructureUnion
Memoryहर member की अलगसभी members साझा
Active membersसभी एक साथएक समय एक
Sizemembers का जोड़ (+ padding)सबसे बड़ा member
एक member लिखने परबाकी अप्रभावितबाकी overwrite
Keywordstructunion
किसके लिए बेहतरकई 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।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

C में structure और union में मुख्य अंतर क्या है?
Structure हर member को अलग memory देता है, इसलिए सभी members एक साथ values रख सकते हैं। Union सभी members में एक ही memory block साझा करता है, इसलिए किसी भी पल केवल एक member की value सही होती है। यही एक बात इनके बाकी सारे अंतर समझा देती है।
एक ही members वाले structure से union का size छोटा क्यों होता है?
क्योंकि union को सिर्फ़ अपने सबसे बड़े member जितनी memory चाहिए, क्योंकि सभी members उसी एक जगह में overlap करते हैं। Structure को हर member की जोड़ी हुई memory (और padding) चाहिए, इसलिए वह आमतौर पर बड़ा होता है।
क्या union एक साथ दो values रख सकता है?
नहीं। एक member में लिखने से बाकी overwrite हो जाते हैं क्योंकि memory साझा है। अगर आप integer member set करके फिर character member पढ़ें, तो आपको उन्हीं bytes का दूसरा रूप मिलता है, दो अलग values नहीं।
Structure की जगह union असल में कब इस्तेमाल करूँ?
Union तब इस्तेमाल करें जब कोई value कई types में से एक हो सकती हो पर एक समय एक ही — जैसे कोई token जो या तो int, या float, या char हो। ऐसे "या-या" हालात में union memory बचाता है, खासकर सीमित memory वाले systems पर।
क्या union हर program में memory घटाता है?
सिर्फ़ तब जब आपको सचमुच एक समय एक ही member चाहिए। अगर सभी members एक साथ चाहिए, तो union data बिगाड़ देगा और structure सही विकल्प है। Union परस्पर-अनन्य (mutually exclusive) data के लिए memory optimisation है, structure का सामान्य विकल्प नहीं।
← Back to C Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.