5.1.22 · D5 · HinglishC Programming

Question bankStructures — declaration, accessing members (. and - - )

1,710 words8 min read↑ Read in English

5.1.22 · D5 · Coding › C Programming › Structures — declaration, accessing members (. and - - )

Traps se pehle, ek shared vocabulary reminder taaki neeche kuch bhi surprise na ho:


True or false — justify karo

Ek hi type ke do struct variables ko b = a; se assign kiya ja sakta hai.
True. Struct assignment har member ko byte-for-byte copy karta hai (shallow copy); yeh C ke un kuch whole-aggregate operations mein se ek hai jo allowed hain, unlike arrays jo assign nahi ho sakte.
Do struct variables ko if (a == b) se compare kiya ja sakta hai.
False. C mein structs ke liye koi built-in == nahi hai; members ke beech padding bytes uninitialised garbage hote hain, isliye identically dikhne wale structs bhi differ kar sakte hain. Tumhe member by member compare karna padega.
sizeof(struct Student) hamesha apne members ke sizes ke sum ke barabar hota hai.
False. Compiler padding insert karta hai taaki har member ek aligned address par baithe, isliye total zyada ho sakta hai. Dekho Memory Alignment & Padding.
struct Point { int x, y; }; declare karne se ek usable variable bhi ban jaata hai.
False. Woh line sirf ek type (blueprint) define karti hai; koi memory reserve nahi hoti. Actual object ke liye tumhe abhi bhi struct Point a; likhna padega.
p->m aur (*p).m har case mein identical results dete hain.
True. -> ka matlab exactly (*p).m hai — yeh pure shorthand hai, koi behavioural difference nahi hai — sirf fewer parentheses.
Ek structure mein ek member ho sakta hai jo apne hi type ka pointer ho.
True. struct Node { int v; struct Node *next; }; legal hai kyunki ek pointer ka size fixed aur known hota hai; yeh Linked Lists ki backbone hai.
Ek structure mein ek member ho sakta hai jo apne hi type ki full (non-pointer) copy ho.
False. Uske liye infinite size chahiye hogi — struct apne andar khud ko contain karega, jo khud ke andar khud ko contain karega, hamesha ke liye. Sirf ek pointer same type ka allowed hai.
Kisi function mein struct ko value se pass karna function ko caller ka original modify karne deta hai.
False. By-value passing puri struct ki copy banata hai; edits sirf copy ko touch karti hain aur return pe khatam ho jaati hain. Caller ka object modify karne ke liye pointer pass karo (&a) — dekho Passing Structures to Functions.
Declaration mein members likhne ka order memory layout ke liye irrelevant hai.
False. Members declaration order mein store hote hain; unhe reorder karne se padding ki amount aur isliye sizeof change ho sakta hai.

Error dhundo

struct Student { char name[20]; int roll; } — kya missing hai?
Closing } ke baad semicolon. Ek struct definition ek declaration statement hai, code block nahi, isliye ise ; se khatam hona chahiye.
s.name = "Asha"; jahaan name hai char name[20] — yeh kyun fail hota hai?
name ek array hai, aur arrays assignable nahi hote. Characters existing slot mein copy karne ke liye strcpy(s.name, "Asha"); use karo.
struct Point *p = &a; p.x = 5; — kya galat hai?
p ek pointer (address) hai, isliye . illegal hai; tumhe p->x = 5 chahiye. Compiler complain karta hai ki p "not a structure" hai.
printf("%d", *p.roll); (p ek struct pointer hai) — yeh bug kyun hai?
. * se zyada tightly bind karta hai, isliye yeh *(p.roll) parse hota hai — nonsense. Tumhara matlab tha (*p).roll ya simply p->roll.
struct Student s; printf("%s", s.name); kisi bhi assignment se pehle — kya danger hai?
s uninitialised hai, isliye name mein garbage bytes hain jisme koi guaranteed '\0' nahi; printf array se aage read kar sakta hai aur crash ho sakta hai ya junk print kar sakta hai.
struct Node { struct Node next; }; — yeh compile kyun nahi hoga?
Yeh apni khud ki full copy embed karta hai, jo infinite size maangti hai. next ko pointer struct Node *next; mein badlo.
e.when->d = 25; jahaan when ek plain struct Date member hai (pointer nahi) — error?
when ek value hai, pointer nahi, isliye ise . se follow karo, yani e.when.d. -> yahan ek non-pointer dereference karne ki koshish karta hai.

Why questions

C -> kyun provide karta hai, jab (*p).m already kaam karta hai?
Pointers-to-structs everywhere hote hain (function args, linked lists), aur (*p).m verbose hai aur isko misparenthesise karna aasaan hai; -> ek clean, unambiguous shorthand hai.
(*p).m mein parentheses actually kyun matter karte hain?
Operator precedence: . * se tighter bind karta hai. Parentheses ke bina, *p.m ka matlab *(p.m) hai, jo pointer ka member m lene ki koshish karta hai aur result dereference karta hai.
Ek structure mein different types ke members kyun ho sakte hain jabki ek array mein nahi ho sakte?
Ek struct har member ko ek named offset se address karta hai, isliye mixed sizes theek hain; ek array uniform index base + i*size se address karta hai, jo ek element type demand karta hai. Contrast dekho Arrays vs Structures mein.
Caller ka struct mutate karne ke liye function ko &a pass karna kyun zaroori hai?
a pass karna ek copy deta hai; function copy edit karta hai. Address &a pass karna function ko pointer ke through original object tak pahunchne deta hai.
typedef structs ke saath itna zyada kyun use hota hai?
Yeh tumhe type ko bina struct word repeat kiye naam dene deta hai, isliye tum struct Student s; ki jagah Student s; likh sakte ho. Dekho typedef.
Member name ko "sirf ek byte offset ka label" kyun kaha jaata hai?
Runtime par koi names nahi hote — compiler s.roll ko translate karta hai "s ka start address plus roll ka fixed offset" mein, isliye naam sirf humans ke liye exist karta hai. Yeh Pointers in C se connect hota hai.
Do identically dikhne wale structs raw memory mein unequal compare kyun kar sakte hain?
Members ke beech padding bytes kisi defined value se initialise nahi hote, isliye byte-wise comparison stale garbage dekh sakta hai even jab har real member match karta ho.

Edge cases

Ek single char member wale struct ke liye sizeof kya report karta hai?
Usually sirf 1 (ek akele char ko koi alignment padding nahi chahiye), lekin agar woh struct kisi array ya doosre struct mein place hota hai, to context ke alignment rules abhi bhi trailing padding add kar sakte hain.
Kya struct Empty { }; (koi member nahi) C mein valid hai?
Standard C mein yeh valid nahi hai — ek struct mein kam se kam ek member hona chahiye. (Kuch compilers ise extension ke roop mein sizeof 0 ya 1 ke saath allow karte hain, lekin iss par rely mat karo.)
Kya b = a; assign karne se struct ke andar array member copy hota hai?
Haan. Struct assignment sare members copy karta hai, array members bhi element-by-element — even though struct ke bahar ek bare array assign nahi ho sakta. Struct array ko "wrap" karke ise copyable banata hai.
Agar do members ki same value ho, kya woh memory share karte hain?
Nahi. Har member apna distinct offset occupy karta hai; equal values do alag jagahon par store hoti hain. Structs kabhi bhi members overlap nahi karte (woh ek union hoga, ek alag construct).
Agar p ek valid-dikhne wala pointer hai jo NULL set hai, toh p->roll ka kya hoga?
Undefined behaviour / crash. -> pehle p dereference karta hai; NULL dereference karna address 0 read karta hai, jo OS forbid karta hai, typically segmentation fault cause karta hai.
Kya tum kisi individual member ka address le sakte ho, jaise &s.roll?
Haan. Ek member ki real memory location hoti hai (s ka base plus uska offset), isliye &s.roll us int ka valid pointer hai — kisi single field ko reference se pass karte waqt kaam aata hai.
Recall One-line rule jo zyaatar traps resolve karta hai

Pucho: "Kya main object hold kar raha hoon ya uska address?" — object → ., address (pointer) → ->. Zyaatar ./-> errors us question ka galat jawab dene se hain.


Connections

  • Pointers in C — har -> trap ultimately ek pointer question hai.
  • Arrays vs Structures — explain karta hai ki structs mixed types aur copying kyun allow karte hain.
  • Linked Lists — self-referential structs aur -> ka classic ghar.
  • typedef — repeated struct keyword hatata hai.
  • Memory Alignment & Paddingsizeof aur comparison traps explain karta hai.
  • Passing Structures to Functions — by value (copy) vs by pointer (mutable).