🔀
Structures & Unions

Unions

Shared Memory Space
💡 Struct alag-alag lockers jaisa hai (har member ki apni jagah) — union ek hi shared locker jaisa hai jisme ek waqt mein sirf ek cheez rakh sakte ho, chahe locker kisi bhi size ka ho.

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;
}
🔀
Struct alag-alag lockers jaisa hai (har member ki apni jagah) — union ek hi shared locker jaisa hai jisme ek waqt mein sirf ek cheez rakh sakte ho, chahe locker kisi bhi size ka ho.
1 / 2
⚡ झट से Recap
  • 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
इस page में (1 subtopics)

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);
  }
}