Dynamic Memory
Fixed size की समस्या
जब आप int marks[50]; लिखते हैं, आप अंदाज़ा लगा रहे हैं। अगर सिर्फ़ 3 students आएँ — आपने 47 slots बर्बाद किए। अगर 60 आएँ — कम पड़ गया। Fixed array आपको size पहले तय करने को मजबूर करता है, इससे पहले कि program को पता हो कि असल में कितना data होगा।
Dynamic memory इसे हल करता है: यह program को ठीक उतनी memory माँगने देता है जितनी चाहिए, चलते समय। यह इस विचार का सरल परिचय है; पूरे malloc/calloc/realloc/free reference के लिए देखें C में dynamic memory allocation।
Stack बनाम heap
आपके program के पास data रखने की दो मुख्य जगहें हैं, और इनका अंतर समझना dynamic memory की कुंजी है।
| Stack | Heap | |
|---|---|---|
| प्रबंधन | अपने आप (compiler) | आप (malloc/free) |
| Size | छोटा, जल्दी तय | बड़ा, लचीला |
| Lifetime | Function लौटने तक | जब तक आप free न करें |
| गति | बहुत तेज़ | थोड़ा धीमा |
सामान्य variables और fixed arrays stack पर रहते हैं। Dynamic memory heap से आती है।
Dynamic memory क्यों है
Dynamic memory आपको दो शक्तियाँ देती है जो stack नहीं दे सकता:
- Size run time पर तय — user से पूछें कितने items, फिर ठीक उतने allocate करें।
- Function से ज़्यादा जीने वाली memory — function के अंदर बना data उसके लौटने के बाद भी valid रह सकता है, क्योंकि heap अपने आप साफ़ नहीं होता।
आपका पहला dynamic array
यह सबसे सरल उदाहरण है: एक array जिसका size user चुनता है।
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("Kitne numbers? ");
scanf("%d", &n);
int *arr = malloc(n * sizeof(int)); // theek n ints
if (arr == NULL) return 1; // hamesha check
for (int i = 0; i < n; i++) arr[i] = i * i;
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
free(arr); // wapas dein
return 0;
}Output:
0 1 4 9
Code में कोई fixed size नहीं — n इसे program चलते समय तय करता है। यही dynamic memory का पूरा मकसद है।
कब इस्तेमाल करें
- Program चलने तक size पता न हो।
- Data को बनाने वाले function के खत्म होने के बाद भी बचना हो।
- Data बड़ा हो — heap में stack से कहीं ज़्यादा जगह है।
छोटी, ज्ञात मात्रा के data के लिए stack पर सादा array आसान और तेज़ है। Dynamic memory तब लें जब सच में लचीलापन चाहिए।
आम गलतियाँ
- Memory इस्तेमाल करने से पहले
mallocको NULL के लिए जाँचना भूलना। freeभूलना, तो program धीरे-धीरे memory leak करता है।- Free करने के बाद memory इस्तेमाल करना (dangling pointer)।
- यह सोचना कि heap memory खुद साफ़ हो जाती है — जब तक आप free न करें, नहीं होती।
उदाहरण बदलें ताकि user से n numbers dynamic array में पढ़े, फिर उनका योग print करे। अलग-अलग n के लिए पुष्टि करें, और अंत में हमेशा free करें।
सारांश
- Fixed arrays आपको size बहुत जल्दी अंदाज़ने को मजबूर करते हैं।
- Stack अपने आप पर छोटा है; heap बड़ा और आपके द्वारा प्रबंधित।
- Dynamic memory (heap से) data को run time पर size करने और functions से ज़्यादा जीने देती है।
- माँगने को
mallocइस्तेमाल करें,NULLजाँचें, और काम पूरा होने परfreeकरें। - malloc, calloc, realloc और free गहराई से देखें dynamic memory allocation।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में dynamic memory क्या है?
malloc से माँगते हैं, इस्तेमाल करते हैं, फिर free से लौटाते हैं। इससे program run time पर तय किसी भी मात्रा का data संभाल सकता है।C में stack और heap में क्या अंतर है?
malloc और free से प्रबंधित करते हैं, और वहाँ memory तब तक रहती है जब तक आप न छोड़ें, जो इसे dynamic data के लिए उपयुक्त बनाता है।अगर arrays हैं तो dynamic memory की ज़रूरत क्यों?
Dynamically allocated memory कहाँ रखी जाती है?
malloc से heap से ली memory तब तक आरक्षित रहती है जब तक आप उसे free से वापस न दें, function calls के पार भी।