Dynamic Memory (malloc/free)
Dynamic memory की ज़रूरत क्यों?
जब आप int a[100]; लिखते हैं, तो आपको size — 100 — code लिखते समय तय करना पड़ता है। पर अगर आपको program चलने तक पता ही न हो कि कितने items होंगे? शायद user तय करे। Size पहले से तय करना या तो memory बर्बाद करता है या जगह कम पड़ जाती है।
Dynamic memory allocation इसे हल करता है। यह आपके program को चलते समय ठीक उतनी memory माँगने देता है जितनी चाहिए, एक बड़े pool से जिसे heap कहते हैं। आपको उस memory का pointer मिलता है, उसे इस्तेमाल करें, और काम खत्म होने पर लौटा दें।
चार functions
ये <stdlib.h> में होते हैं:
| Function | क्या करता है |
|---|---|
malloc(size) | size bytes का block देता है (content garbage) |
calloc(n, size) | n elements देता है और सभी bytes 0 करता है |
realloc(p, size) | पहले से allocate block का size बदलता है |
free(p) | Memory system को वापस देता है |
malloc: block allocate
malloc कुल bytes लेता है जितने आप चाहते हैं। हम आमतौर पर sizeof से गुणा करते हैं ताकि हर system पर सही रहे।
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = malloc(3 * sizeof(int)); // 3 ints की जगह
if (arr == NULL) return 1; // हमेशा जाँचें!
arr[0] = 10; arr[1] = 20; arr[2] = 30;
printf("%d %d %d\n", arr[0], arr[1], arr[2]);
free(arr); // वापस दें
return 0;
}10 20 30
अगर system memory न दे सके, तो malloc NULL लौटाता है। NULL pointer इस्तेमाल करने से program crash होता है, इसलिए इस्तेमाल से पहले जाँचें।
calloc: allocate और zero
calloc malloc जैसा है पर memory को 0 भी कर देता है, और यह count तथा element size अलग-अलग लेता है।
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = calloc(3, sizeof(int)); // 3 ints, सब zero
if (arr == NULL) return 1;
printf("%d %d %d\n", arr[0], arr[1], arr[2]); // 0 0 0
free(arr);
return 0;
}0 0 0
malloc के साथ ये values garbage होतीं। जब साफ़, zero शुरुआत चाहिए तब calloc इस्तेमाल करें।
realloc: block resize
मान लीजिए आपने 3 ints की जगह ली पर अब 5 चाहिए। realloc block बड़ा करता है, पुरानी values रखते हुए।
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = malloc(3 * sizeof(int));
arr[0] = 1; arr[1] = 2; arr[2] = 3;
arr = realloc(arr, 5 * sizeof(int)); // 5 तक बड़ा करें
arr[3] = 4; arr[4] = 5;
for (int i = 0; i < 5; i++) printf("%d ", arr[i]);
free(arr);
return 0;
}1 2 3 4 5
realloc block को हिला सकता है, इसलिए हमेशा उसका result किसी pointer में वापस assign करें (बेहतर हो कि एक temporary में जिसे आप जाँचें), यह मानकर न चलें कि पुराना pointer अब भी valid है।
free और memory leaks
हर block जो आप allocate करते हैं उसे free से छोड़ना होगा। अगर भूल गए, तो वह memory program खत्म होने तक आरक्षित रहती है — एक memory leak। घंटों चलने वाले program में leaks इकट्ठा होकर उसे crash कर सकते हैं।
int *p = malloc(sizeof(int)); *p = 42; free(p); // memory release करें p = NULL; // dangling pointer से बचें
Memory leak = आप कभी free नहीं करते। Dangling pointer = free करने के बाद pointer इस्तेमाल करना। free के बाद p = NULL दूसरे से बचाता है।
आम गलतियाँ
- Memory इस्तेमाल करने से पहले यह न जाँचना कि malloc/calloc ने NULL तो नहीं लौटाया।
freeभूल जाना, जिससे memory leak होता है।- Pointer को दो बार free करना, या
freeके बाद इस्तेमाल करना (dangling pointer)। - बिना जाँचे
p = realloc(p, ...)लिखकर original pointer खोना — realloc fail होने पर NULL लौटाता है और आप पुराना block खो देते हैं।
User से एक number n माँगें, malloc से n integers का array लें, उसमें पहले n सम संख्याएँ भरें, print करें, और free करें। पुष्टि करें कि आपके एक malloc के लिए ठीक एक free है।
सारांश
- Dynamic memory program को चलते समय heap से memory माँगने देती है।
mallocallocate करता है (garbage);callocallocate करके zero करता है।reallocblock resize करता है और हिला सकता है — उसका result दोबारा assign करें।- हर allocation के लिए एक मेल खाता
freeचाहिए, वरना memory leak होता है। NULLजाँचें, और free के बाद pointers कोNULLकरें।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में dynamic memory allocation क्या है?
malloc और calloc जैसे functions से heap नामक क्षेत्र से memory लेता है और आपको उसका pointer देता है। इससे आपका program उतनी data संभाल सकता है जितनी आपको पहले से पता नहीं थी।malloc और calloc में क्या अंतर है?
malloc memory को uninitialised छोड़ता है (उसमें garbage रहता है), जबकि calloc हर byte को zero कर देता है। साथ ही malloc एक कुल size argument लेता है, जबकि calloc elements की संख्या और हर एक का size अलग-अलग लेता है।C में memory leak क्या है?
free नहीं करते। वह memory program खत्म होने तक आरक्षित और अनुपयोगी रहती है। लंबे समय चलने वाले programs में बार-बार के leaks धीरे-धीरे सारी उपलब्ध memory खा जाते हैं।C में realloc क्या करता है?
realloc पहले से allocate किए block का size बदलता है — जैसे और जगह चाहिए तो array बड़ा करना। यह block को नई जगह ले जा सकता है और नया pointer लौटाता है, इसलिए हमेशा उसका result वापस assign करें और इस्तेमाल से पहले जाँचें।Dangling pointer क्या है?
NULL कर दें, ताकि वह release हुई memory की ओर न इशारा करे।