Unions
Union struct jaisa hi dikhta hai (syntax mein), lekin bahut bada farq hai: struct ke saare members ki alag-alag memory hoti hai (sab ek saath exist karte hain), lekin union ke SAARE members ek hi memory location SHARE karte hain — ek waqt mein sirf ek member ki valid value hoti hai.
sizeof(union) hamesha uske SABSE BADE member jitna hota hai (kyunki sabko fit hona hai usi jagah mein), jabki sizeof(struct) sab members ke sizes ka (roughly) total hota hai.
Use-case: jab tumhe pata ho ki ek waqt mein sirf ek type ki value chahiye hogi (memory bachane ke liye) — jaise ek variant type jo kabhi int hoga, kabhi float.
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data d;
d.i = 10;
printf("%d\n", d.i); // 10
d.f = 3.14; // ab i ki value overwrite ho gayi!
printf("%f\n", d.f); // 3.14
printf("%d\n", d.i); // garbage — same memory, alag interpretation
printf("%lu\n", sizeof(union Data)); // sabse bade member (str, 20 bytes) jitna
return 0;
}- Union ke saare members ek hi memory share karte hain
- sizeof(union) = sabse bade member jitna
- Ek waqt mein sirf ek member ki value valid hoti hai
Union ka sabse bada risk hai galat member padhna. "Tagged union" pattern is problem ko solve karta hai — union ke saath ek extra field (tag/enum) rakho jo batata hai currently kaunsa member valid hai.
enum Type { INT_TYPE, FLOAT_TYPE };
struct TaggedData {
enum Type type; // tag — batata hai kya valid hai
union {
int i;
float f;
} value;
};
void print(struct TaggedData d) {
if (d.type == INT_TYPE) {
printf("%d\n", d.value.i);
} else {
printf("%f\n", d.value.f);
}
}