5.1.24 · D5 · HinglishC Programming
Question bank — Unions — overlapping memory
5.1.24 · D5· Coding › C Programming › Unions — overlapping memory
Reveals mein ek convention hai: ::: ke baad tumhe verdict + reasoning milti hai, kabhi bare "true"/"false"/"yes"/"no" nahi.
True or false — justify karo
Union ke saare members hamesha same address pe start hote hain
True. Har member union ke offset 0 se shuru hota hai; yahi shared start poora point hai — isi wajah se woh overlap karte hain.
Union ka woh member read karna jo tumne last write nahi kiya tha, compiler error deta hai
False. Yeh compile aur run dono theek se hota hai; bas wahan jo bhi bytes hain unhe us member ki type ki tarah reinterpret karta hai, toh tumhe meaningless (lekin legal-to-execute) data milta hai.
sizeof(union U) uske sabse bade member se bada ho sakta hai
True. Alignment size ko UPAR round kar sakti hai taaki union ke arrays ke elements correctly aligned rahein — dekho Memory alignment and padding. Haan, yeh kabhi sabse bade member se chota nahi hota.
Ek union member likho, phir doosra likhne ke baad pehla intact rehta hai
False. Woh same bytes share karte hain; doosra write pehle waali storage ko overwrite (reinterpret) kar deta hai, toh pehla chala jaata hai.
char c[4] type ka union member aur int i member same chaar bytes refer karte hain
True. Dono offset 0 se start hote hain aur dono 4 bytes span karte hain, toh
c[0..3] aur i literally same memory hain — yahi type punning ki neenv hai.union U { int i; double d; }; ka sizeof == 12 hai kyunki 4 + 8 = 12
False. Yeh struct ka rule hai (sum). Union ki size LARGEST member ki hoti hai (yahan 8), possibly alignment ke liye round ki gayi — sum nahi.
Ek union ek saath valid int aur valid float dono hold kar sakta hai
False. Sirf sabse recently written member meaningful hota hai; doosra wahi bytes ko reinterpret karta hai, toh "dono ek saath valid" possible nahi hai.
union Data d = {65}; initialize karna har member ko 65 set karta hai
False. Yeh sirf PEHLA member initialize karta hai (yahan
d.i = 65); baaki members simply same bytes hain, meaningful tab hain jab pehle member ki type ki tarah read karo.Spot the error
union U { int i; float f; };
union U u;
u.i = 65;
float x = u.f; // "convert int 65 to float"Kya galat hai?
Yeh convert NAHI karta — int 65 ke bit pattern ko float ki tarah reinterpret karta hai, ek tiny garbage value deta hai. Real conversion ke liye likho
float x = (float)u.i;.union U { char c; int i; };
union U u;
u.c = 'A';
printf("%d\n", u.i); // expecting 65u.i reliably 65 kyun nahi hai?
Tumne sirf 1 byte (
u.c) likha; i ke baaki 3 bytes uninitialised hain. i read karne par saare 4 bytes read hote hain, toh top 3 garbage hain — result 65 guaranteed nahi hai.struct Variant { enum {INT, FLOAT} tag; union { int i; float f; } val; };
struct Variant v;
v.val.i = 10;
// tag never set
if (v.tag == FLOAT) printf("%f\n", v.val.f);Kya galat hua?
Tag kabhi assign nahi kiya, toh
v.tag garbage hold karta hai aur branch unpredictable hai. Ek tagged union mein tumhe har baar jab koi member write karo, tag bhi set KARNA CHAHIYE, warna bookkeeping ek jhooth hai.union U { int i; char c[4]; } u;
u.i = 0x41424344;
printf("%c\n", u.c[0]); // "must be 'A'"'A' guaranteed kyun nahi hai?
Yeh Endianness — byte order par depend karta hai. Little-endian par
c[0] low byte 0x44 ('D') hai; sirf big-endian par yeh 0x41 ('A') hai. Comment ek aisa byte order assume kar raha hai jo usne kabhi check nahi kiya.union U { int i; float f; };
union U a = { .f = 3.14f };
printf("%d\n", a.i); // "read what I stored"Kya yahan a.i read karna defined aur meaningful hai?
Float bits ko int ki tarah read karta hai — run karna legal hai, lekin number 3.14 ki IEEE-754 representation hai, 3 nahi, toh yeh sirf ek bit pattern ki tarah meaningful hai, value ki tarah nahi.
Why questions
Union ki size largest member ki kyun hoti hai, sum ki kyun nahi?
Har member offset 0 se start hota hai aur doosron ko overlap karta hai, toh storage ko sirf ek single worst-case (sabse bade) member ke liye kaafi hona chahiye — kabhi saare ek saath nahi.
Union "remember" kyun nahi karta ki currently kaunsa member active hai?
Union sirf raw overlapping bytes hain jisme koi hidden flag nahi; same bit pattern ko kisi bhi member ke through read kiya ja sakta hai, toh type mein kuch record nahi hota ki aakhri write kaun sa tha. Tum khud ise tag se track karte ho — dekho Enums.
Unions hain hi kyun jab structs already data bundle karte hain?
Parent note ne do reasons stress kiye: memory bachana (kai slots ki jagah ek) aur same bytes ko deliberately alag types ki tarah reinterpret karna (Type punning and bit-level reinterpretation).
sizeof(union U) sabse bade member se bada kyun ho sakta hai?
Alignment padding: size ko strictest member ki alignment ke multiple tak round up kiya jaata hai taaki union ka array har element ko correctly aligned rakhe. Real value dekhne ke liye sizeof operator use karo.
d.i = 65 ke baad (float)d.i aur d.f read karna alag kyun hai?
Cast ek arithmetic conversion perform karta hai jo
65.0f produce karta hai (correct value). d.f read karna integer 65 ke bits copy karta hai aur unhe float maanta hai — same bytes, bilkul alag meaning.Endianness unions ke liye kyun matter karta hai lekin parent ka sizing rule ise mention nahi karta?
Sizing sirf member sizes aur alignment par depend karti hai. Endianness sirf affect karta hai kaunsa byte kahan jaata hai jab tum overlapping bytes ko punning-read karte ho, toh yeh interpretation ke liye matter karta hai,
sizeof ke liye nahi.Edge cases
Sirf char c; wale union ka sizeof kya hai?
Kam se kam 1 (sabse bada member 1 byte ka hai);
char ki alignment 1 hai, toh koi padding force nahi hoti — sizeof == 1.Agar union declare karo bina initialization ke, toh koi member immediately read karo toh kya hoga?
Tum indeterminate bytes read karte ho — storage mein jo bhi us memory mein tha woh hota hai, toh jab tak ek member write na karo, koi bhi member garbage hai.
union U { char c[3]; int i; }; ke liye sizeof 4 kyun ho sakta hai jabki declared largest member char c[3] hai (3 bytes)?
int ko 4-byte alignment chahiye, toh union ki size 4 tak round up hoti hai; waise bhi size ke hisaab se sabse bada member int (4) hi hai, toh woh fit hota hai — answer 4 hai.Agar union ke saare members ka size equal ho (jaise int i; float f; char c[4];), toh kya size sirf usi common size ke barabar hogi?
Haan — equal sizes ka max wahi size hoti hai (yahan 4), aur agar uski alignment isme divide hoti hai (4 divides 4) toh extra padding nahi add hoti, toh
sizeof == 4.Kya union member ek struct ho sakta hai, aur kya isse sizing rule change hota hai?
Haan, member ek struct ho sakta hai; rule same rehta hai — union ki size sabse bade member ki size hoti hai (struct ki poori size, padding included) alignment ke liye round ki gayi.
Kya yeh defined behaviour hai ki do union members — jo dono structs hain aur jinke leading fields same hain — ki "common initial sequence" read karo?
Haan — C explicitly allow karta hai shared leading members ko read karna un do structs mein jo ek union mein hain agar unke initial field types match karein, yeh kuch girti-chunti portable punning cases mein se ek hai.
Connections
- Structs — separate memory for each member
- Memory alignment and padding
- Endianness — byte order
- Type punning and bit-level reinterpretation
- Enums
- sizeof operator