struct Variant { enum { INT, FLOAT, STR } tag; // kamre mein ab kaun rehta hai? union { int i; float f; char *s; } val;};
KYUN: union ke andar koi runtime flag nahi hota jo bataye ki active member kaun sa hai. Tag tumhari bookkeeping hai taaki tum sirf wahi padho jo tumne last mein likha tha.
Recall Feynman: 12-saal ke bacche ko samjhao
Ek whiteboard imagine karo. Tum uspar ek number likh sakte ho, YA ek word, YA ek drawing — lekin sirf ek cheez fit hoti hai kyunki yeh usi board hai. Agar tum apne number ke upar word likhte ho, number chala jaata hai. Union woh single whiteboard hai jo alag-alag tarah ki "writing" share karti hai. Struct, iske ulta, ek notebook hai jisme har cheez ke liye alag page hai. Board exactly utna bada hota hai jitna sabse badi cheez hogi jo tum likh sakte ho.
Woh sab same memory share karte hain (offset 0 se shuru hote hain), isliye ek waqt mein sirf ek valid hota hai.
Union ka size kaise determine hota hai?
Yeh uske largest member ke size ke barabar hota hai, alignment satisfy karne ke liye round up hoke.
Struct mein size kaise determine hota hai vs union mein?
struct = sum of members (+padding); union = size of largest member (+padding).
Jab tum ek union member likhte ho toh doosre members ka kya hota hai?
Unke bytes overwrite/reinterpret ho jaate hain — unhe ab padhne par meaningless data milta hai.
Kya alag union member padhna type conversion karta hai?
Nahi — yeh raw bit pattern ko reinterpret karta hai (type punning), arithmetic conversion nahi.
Tagged union kya hota hai aur kyun zaroori hai?
Ek struct jo union ke saath ek enum tag hold karta hai jo active member record karta hai, kyunki union khud yaad nahi rakhta ki kaun sa member live hai.
union { char c; int i; double d; } ke liye sizeof kya hai?
8 (sabse bade member, double, ka size, jo pehle se 8-aligned hai).
Little-endian par u.i = 65 ke saath, u.c[0] kya dega?