5.1.14 · Coding › C Programming
Intuition Core idea (WHY yeh exist karta hai)
Jab tum int arr[100]; likhte ho, tumhe compile time par size pata hona chahiye . Lekin kya hoga agar user runtime par decide kare ki kitne items chahiye? Ya toh tum memory waste karoge (ek bahut bada array "just in case" declare karke) ya kam pad jaayegi (bahut chhota declare karne par). Dynamic memory tumhe allow karta hai ki operating system se memory at runtime maango, bilkul utni hi jitni chahiye, ek region se jo heap kehlaati hai. Woh tumhari hoti hai jab tak tum khud use free se wapas nahi kar dete.
Sab <stdlib.h> mein declare hote hain. Yeh bytes mein kaam karte hain aur tumhe ek void * dete hain (ek generic address jo tum apne type mein cast karte ho).
Definition Heap functions
malloc(n) — m emory alloc ate: n bytes reserve karta hai, contents uninitialized (garbage) hote hain.
calloc(count, size) — c leared alloc ate: count * size bytes reserve karta hai, sab zero set hote hain.
realloc(ptr, n) — ek existing block ko n bytes tak resize karta hai, purane contents preserve karte hue.
free(ptr) — ek block ko heap ko wapas karta hai taaki reuse ho sake.
Intuition malloc vs calloc vs realloc — har ek ka
ek fark
malloc : sabse fast, lekin tumhe dirty memory milti hai. Use karo jab tum vaise bhi har byte overwrite karoge.
calloc : do extra kaam karta hai — yeh count × size multiplication tumhare liye karta hai (toh tum ek product ki jagah do clear arguments likhte ho) aur memory zero karta hai. Use karo jab tumhe clean zeros chahiye (jaise counters, flags).
realloc : ek maatra tarika hai ek existing allocation ko manually copy kiye bina grow/shrink karne ka.
Intuition Overflow ke baare mein ek note (precision matter karta hai)
Log aksar kehte hain "calloc overflow-safe hai." C standard require nahi karta ki calloc detect kare ki count * size size_t ko overflow karta hai ya nahi; yeh check karta hai ya nahi yeh implementation-defined hai. Zyaadaatar modern, high-quality libc implementations do overflow detect karte hain aur NULL return karte hain, isliye calloc(n, sz) practice mein usually safer hota hai malloc(n * sz) se — lekin is check ko language ki guarantee mat samjho. Agar tumhe portable hona hai, toh multiplication khud validate karo.
Tum kabhi memorize nahi karte "malloc ek number leta hai." Tum argument derive karte ho:
Worked example Worked Example 3 —
realloc se buffer grow karna
int cap = 2 , len = 0 ;
int * v = malloc (cap * sizeof ( * v));
for ( int x = 0 ; x < 10 ; x ++ ) {
if (len == cap) { // Step A: full?
cap *= 2 ; // Step B: capacity double karo
int * tmp = realloc (v, cap * sizeof ( * v)); // Step C: resize
if ( ! tmp) { free (v); return 1 ; } // Step D: safe-assign
v = tmp; // Step E: commit
}
v [len ++ ] = x;
}
free (v);
Step A — len aur cap alag kyun track karein? cap = allocated space; len = used space. Tum tabhi grow karte ho jab used, allocated tak pahunch jaaye.
Step B — Double (geometric growth) kyun? Doubling karne se n insertions ki total cost O ( n ) amortized hoti hai, O ( n 2 ) nahi. Har baar 1 add karne par har push par poora array copy hota.
Step C — realloc kaise kaam karta hai? Yeh block ko in-place extend kar sakta hai, ya naya block allocate karke tumhare purane bytes copy karke purana free karta hai — sab transparently.
Step D/E — tmp variable kyun? Agar realloc fail ho toh woh NULL return karta hai lekin purana block still valid hai . Seedha v = realloc(v, ...) likhne par NULL return hone par purana block leak ho jaata (uska address kho gaya).
Common mistake "Maine free kar diya, toh pointer use kar sakta hoon." (use-after-free)
Kyun sahi lagta hai: free(p) ke baad bhi variable p ek address hold karta rehta hai; bits nahi bade, toh lagta hai usable hai.
Reality: Woh memory ab allocator ki hai aur kisi aur ko di ja sakti hai. Use padhna/likhna undefined behavior hai.
Fix: free(p); ke baad immediately p = NULL; karo.
malloc memory zero karta hai jaise calloc."
Kyun sahi lagta hai: Ek fresh program par OS aksar zero pages deta hai, toh tumhara pehla malloc zeroed lagta hai .
Reality: Woh luck hai. Reused heap memory mein purana garbage hota hai. Sirf calloc zeros guarantee karta hai.
Fix: calloc use karo, ya explicitly initialize karo.
calloc C standard se guaranteed overflow-safe hai."
Kyun sahi lagta hai: Glibc, musl, aur zyaadaatar real-world libcs do NULL return karte hain jab count * size overflow ho, toh "hamesha kaam karta hai" lagta hai.
Reality: C standard overflow behavior ko implementation-defined chhod deta hai; ek conforming-but-minimal implementation check karne ki zaroorat nahi. Iss par rely karna non-portable hai.
Fix: Protection ko ek practical bonus samjho, guarantee nahi. Portable code ke liye allocate karne se pehle count * size khud validate karo.
Common mistake Ek hi pointer ko do baar
free karna (double free).
Kyun sahi lagta hai: "Zyaada baar clean karne se kya farak padega." Over-clean karna safer lagta hai.
Reality: Allocator ki internal bookkeeping corrupt hoti hai → crash ya exploitable bug.
Fix: Exactly ek baar free karo; pointer null karne par doosra free(NULL) ek harmless no-op ban jaata hai.
v = realloc(v, n) (self-assign leak).
Kyun sahi lagta hai: Padhne par lagta hai "v ko naye block par update karo," jo tumhara irada hota hai jab succeed kare.
Reality: Failure par realloc NULL return karta hai lekin purana block rakhta hai — ab tumne ek maatra pointer overwrite kar diya → leak.
Fix: Ek temporary use karo, phir sirf success par commit karo.
Recall
free actually kya free karta hai?
Yeh block ko heap allocator ki free list mein reuse ke liye return karta hai — yeh bytes wipe nahi karta aur tumhara pointer variable change nahi karta .
Recall
malloc(n * sizeof(*p)) ko malloc(n * sizeof(int)) se kyun prefer karein?
sizeof(*p) automatically p ka type track karta hai, toh agar type change ho toh line correct rehti hai — kam bug surface.
Recall Ek case batao jahan
calloc strictly better hai malloc se.
Jab tumhe zero-initialized memory chahiye (counters/flags); zyaadaatar implementations mein yeh size ko count/size mein split karta hai aur multiplication overflow detect karta hai (haalaanki woh overflow check implementation-defined hai, standard-mandated nahi).
Recall Feynman: 12-saal ke bachche ko samjhao
Ek library socho. Ek normal array aise hai jaise aane se pehle fixed table book karna — tumhe guess karna padta hai kitne dost aayenge. Heap librarian jaisi hai : tum jaate ho aur kehte ho "mujhe 5 kursiyan chahiye" abhi (malloc). Agar kursi ganди thi toh tum khud saaf karo; agar tidy librarian (calloc) se maango toh woh saaf kursiyan deta hai. Baad mein aur kursiyan chahiye? realloc badi jagah dhundh ke tumhara saamaan le jaata hai. Jaate waqt, tumhe kursiyan wapas karni hain (free) varna koi aur use nahi kar sakta — yahi "leak" hai. Aur wapas karne ke baad, unpar baithna band karo (pointer mat use karo), varna kisi aur ki lap milegi!
Mnemonic Charon yaad karo
"My Cat Really Frets" → M alloc (messy), C alloc (clean), R ealloc (resize), F ree (finish).
Aur golden rule: Har malloc ka ek matching free hota hai — jaise har ( ka ek ) hota hai.
Pointers in C — dynamic memory pointers return karta hai; tumhe void * aur casting samajhna hoga.
Arrays vs Pointers — a[i] malloc'd blocks par kaam karta hai pointer arithmetic ki wajah se.
The Stack and the Heap — automatic vs dynamic variables kahan rehte hain aur lifetimes kyun differ karti hain.
Memory Leaks and Valgrind — missing frees pakadne ke liye tooling.
sizeof operator — byte counts compute karne ka aadhar.
Undefined Behavior in C — use-after-free, double-free, out-of-bounds.
malloc/calloc/realloc/free kaunsa header declare karta hai? <stdlib.h>
malloc se returned memory ka contents kya hota hai?Uninitialized garbage (zeroed nahi)
calloc se returned memory ka contents kya hota hai?Sab bytes zero set hoti hain
calloc(count, size) ke do arguments ka kya matlab hai?elements ki sankhya aur har ek ka size; yeh count*size bytes allocate karta hai
Kya C standard guarantee karta hai ki calloc multiplication overflow detect kare? Nahi — overflow handling implementation-defined hai; zyaadaatar real libcs check karke NULL return karte hain, lekin yeh standard-mandated nahi hai
malloc failure par kya return karta hai?NULL
realloc kya preserve karta hai?Purane block ka contents (chhote size tak, purana ya naya jo bhi chhota ho)
realloc ke saath temporary pointer kyun use karein?Failure par woh NULL return karta hai lekin purana block rakhta hai; directly assign karne par purana block leak ho jaata
Dangling pointer kya hota hai? Ek pointer jo already freed memory ka address hold karta hai
free(p) ke baad immediately kya karna chahiye?p = NULL; set karo use-after-free aur double-free se bachne ke liye
Memory leak kya hota hai? Allocated heap memory jo kabhi free nahi ki gayi aur jiska pointer kho gaya, toh reuse nahi ho sakti
Buffer grow karte waqt capacity double kyun karte hain? Geometric growth se amortized O(n) total insertion cost milti hai O(n^2) ki jagah
malloc kaunsa type ka pointer return karta hai? void *, C mein kisi bhi object pointer type mein implicitly convertible
Kya free(NULL) safe hai? Haan, yeh ek defined no-op hai
malloc(n * sizeof(*p)) n elements ke liye kitne bytes request karta hai?n × sizeof(*p) bytes
Overflow check impl-defined