Question bank — Memory layout — text, data, BSS, heap, stack segments
5.1.15 · D5· Coding › C Programming › Memory layout — text, data, BSS, heap, stack segments
Traps se pehle zaruri vocabulary
Neeche kuch traps low-level Unix terms pe based hain. Unhe ek baar yahan define kar lete hain taaki page pe koi cheez use se pehle clear ho jaye.
Woh picture jise tum drill kar rahe ho
Traps se pehle, layout apni aankhon mein fix karo. Ye virtual address space hai jo ek process dekhti hai — bytes ka ek lamba column, sabse chhota address neeche, sabse bada upar. Figure 1 poora map hai, jisme read-only rodata section aur sabse upar kernel region bhi shaamil hai.

Figure 1 — Full user address space (low → high). Text, rodata, Data, BSS,
brkheap, sharedmmap/library region, stack, aur sabse upar kernel band jo user code touch nahi kar sakta.
Figure 2 ek dynamic idea capture karta hai jis par poori page depend karti hai: heap aur stack ek shared gap mein opposite ends se expand hote hain, jahan chhota brk heap hota hai, aur jahan large mmap blocks actually land karte hain.

Figure 2 — Heap vs stack ek shared gap mein grow karte hue. Program break neeche se upar jaata hai, stack pointer upar se neeche aata hai,
mmapblocks side mein land karte hain, aur guard page woh point mark karta hai jahan collision crash ban jaata hai.
True ya false — justify karo
Ek uninitialized global int g; mein garbage hota hai jab tak tum ise assign nahi karte.
Ek global int x = 0; Data segment mein rehta hai kyunki tumne initializer likha.
= 0 bhi all-zero information hai, isliye compiler ise BSS mein rakhta hai, Data mein nahi; sirf non-zero initializers Data force karte hain.BSS runtime pe Data se kam RAM use karta hai.
Text segment read-only hai isliye viruses ek running program mein code inject nahi kar sakte.
W^X (write XOR execute; vocabulary box dekho) ke under Text pages executable-not-writable hote hain, isliye apni instructions overwrite karna fault karta hai; lekin attackers phir bhi control flow hijack karke execution kahin aur redirect kar sakte hain (dekho Buffer overflow and stack smashing).Heap aur stack ka ek fixed, pre-assigned size boundary hota hai unke beech mein.
static int s = 0; ek function ke andar stack pe rehta hai kyunki ye locally declare kiya gaya hai.
static static storage duration deta hai, isliye s BSS mein rehta hai (zero init) aur calls ke across persist karta hai; sirf uska scope local hai.Do processes jo same program run kar rahe hain, ek Text segment ki copy share karte hain.
mmap se isi tarah share hoti hain.Successive malloc calls hamesha pichle se zyaada higher addresses return karti hain.
mmap-backed large allocations lower ya scattered addresses de sakte hain.malloc se return hua pointer tab destroy ho jaata hai jab wo function return karta hai jisne malloc call kiya tha.
Stack overflow aur heap ka khatam hona same "out of memory" condition hai.
malloc NULL return karta hai. Alag segments, alag symptoms.Kernel tumhare program ke address space ke middle mein kahin hota hai.
Error dhundho
"Uninitialized globals unpredictable hote hain, isliye main unhe safety ke liye hamesha zero se initialize karta hoon."
= 0 use Data mein move nahi karta vaise bhi. Habit harmful nahi hai, lekin reasoning (ki ye unsafe tha) galat hai."Maine ek huge int buf[1000000]; global banaya, isliye meri executable file 4 MB badh gayi."
"Function return ke baad memory rakhne ke liye, maine array ko function ke andar static declare kiya."
"Mera program stack overflow se crash hua, isliye maine stack space release karne ke liye free() call kiya."
free sirf heap blocks release karta hai aur stack pe kuch nahi karta. Stack frames return pe automatically reclaim hote hain; fix hai kam recursion depth ya chhote locals, free nahi."Maine ek function se &local return kiya aur caller ne use theek se use kiya, isliye stack addresses return karna kaam karta hai."
local stack pe hai aur uska frame return ke baad gone hai, isliye pointer dangling hai (dekho Pointers and dangling pointers); memory kabhi bhi overwrite ho sakti hai."char *msg = "hello"; — main safely msg[0] = 'H' kar sakta hoon."
Why questions
Globals ko do segments (Data aur BSS) mein kyun split karte hain ek ki jagah?
Stack neeche kyun grow karta hai (lower addresses ki taraf) jabki heap upar grow karta hai?
Stack memory automatically free kyun ho jaati hai lekin heap memory nahi?
free call karna padta hai.Text segment ko alag kyun rakha jaata hai aur read-only kyun mark kiya jaata hai?
W^X ke under MMU un pages ko non-writable mark karta hai taaki instructions pe accidental ya malicious writes fault karein (dekho Virtual memory and paging).Local variables aksar malloced blocks se bahut higher addresses kyun dikhate hain?
brk heap BSS ke upar low addresses se upar grow karta hai, isliye ek snapshot mein aksar stack addresses heap se kaafi upar dikhte hain.C standard statics ke liye zero guarantee karta hai lekin locals ke liye nahi, kyun?
Shared libraries ko copy karne ki jagah mmap kyun kiya jaata hai?
mmap karke ek library ko read-only karne se har process same physical pages map kar sakti hai, isliye libc ki ek copy sab ke liye kaam karti hai — Text segment jaisi hi sharing trick.Edge cases
Ek global array jo declare toh hai lekin kabhi use nahi hua: kya ye runtime pe RAM consume karta hai?
int *p = malloc(0); — kahan kuch bhi rehta hai, aur kya p usable hai?
p khud stack pe rehta hai, lekin malloc jo bhi bytes reserve karta hai wo heap se aate hain; malloc(0) NULL ya ek unique non-dereferenceable pointer return kar sakta hai, isliye iske through read/write karna undefined hai — sirf free(p) safe hai.Ek recursion bina base case ke: kaun sa segment fill up hota hai aur kya hota hai?
Kya heap kabhi Data/BSS region ke kisi hisse se lower address occupy kar sakta hai?
brk heap BSS ke bilkul upar se shuru hota hai jaise program break badhta hai; lekin mmap ke zariye bade allocations middle mein kahin land karte hain, isliye "BSS ke hamesha upar" rule sirf brk-based heap ke liye sahi hai.Tum free(p) karte ho phir *p read karte ho. Kaun sa segment involved hai aur ye dangerous kyun hai?
p dangling hai; bytes kabhi bhi reuse ya scramble ho sakte hain (dekho Pointers and dangling pointers).static const int table[] = {1,2,3}; — Data ya BSS ya kuch aur?
const hai ye typically writable Data ki jagah read-only rodata section mein land karta hai.Kya user code address space ke top pe kernel-space addresses read kar sakta hai?
Connections
- Static and global variables — storage duration — Data-vs-BSS decision rules.
- malloc, calloc, realloc and free — heap lifetime aur upar ke traps.
- Pointers and dangling pointers — returning-stack-address aur use-after-free traps.
- Stack frames and the calling convention — stack self-clean kyun hota hai.
- Virtual memory and paging — pages, permissions,
mmapaur kernel split. - Buffer overflow and stack smashing — read-only Text full protection kyun nahi hai.