C प्रोग्राम की रनटाइम मेमोरी कई सेगमेंट्स में व्यवस्थित होती है।
मेमोरी सेगमेंट्स (उच्च एड्रेस से निम्न एड्रेस)
HIGH ADDRESS ┌─────────────────────┐ │ Stack │ ← ग्रोथ: नीचे की ओर (हाई → लो) │ (लोकल वेरिएबल्स, │ फंक्शन कॉल्स, रिटर्न एड्रेस │ फंक्शन पैरामीटर्स) │ ├─────────────────────┤ │ Heap │ ← ग्रोथ: ऊपर की ओर (लो → हाई) │ (malloc, new) │ डायनामिक अलोकेशन ├─────────────────────┤ │ BSS (Uninitialized│ ← अनइनिशियलाइज़्ड ग्लोबल/स्टेटिक │ Data Segment) │ (जीरो-इनिशियलाइज़्ड) ├─────────────────────┤ │ Data Segment │ ← इनिशियलाइज़्ड ग्लोबल/स्टेटिक │ (Initialized) │ (नॉन-जीरो मान) ├─────────────────────┤ │ Text Segment │ ← कोड (रीड-ओनली) │ (Code) │ इंस्ट्रक्शन्स, लिटरल्स └─────────────────────┘ LOW ADDRESS
विस्तृत विवरण
| सेगमेंट | कंटेंट | रनटाइम व्यवहार | उदाहरण |
|---|---|---|---|
| Text (Code) | मशीन इंस्ट्रक्शन्स, स्ट्रिंग लिटरल्स, const डेटा (कभी-कभी) | रीड-ओनली, फिक्स्ड आकार | फंक्शन कोड |
| Initialized Data | ग्लोबल/स्टेटिक वेरिएबल्स जिनके स्पष्ट इनिशियलाइजर हैं | रनटाइम पर रीड-राइट, फिक्स्ड आकार | int x = 10; |
| BSS (Uninit Data) | अनइनिशियलाइज़्ड ग्लोबल/स्टेटिक वेरिएबल्स | प्रोग्राम शुरू होने पर जीरो-फिल्ड, रीड-राइट | int y; (ग्लोबल) |
| Heap | डायनामिक मेमोरी (malloc, new) | रनटाइम पर ग्रो/श्रिंक, प्रोग्रामर मैनेज्ड | malloc(100) |
| Stack | लोकल वेरिएबल्स, पैरामीटर्स, रिटर्न एड्रेस, सेव्ड रजिस्टर्स | फंक्शन कॉल पर ग्रो, रिटर्न पर श्रिंक, LIFO | int a; func(); |
आकार जांचने के लिए कमांड
size program # सेगमेंट आकार दिखाता है (text, data, bss) objdump -h program # सेक्शन हेडर्स
स्टैक vs हीप
- स्टैक: तेज, स्वचालित, सीमित आकार (~8MB लिनक्स पर), LIFO।
- हीप: धीमा (अलोकेटर ओवरहेड), मैनुअल, बड़ा (वर्चुअल मेमोरी तक), फ्रैगमेंटेशन संभव।