📘 Lesson  ·  Lesson 57

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 पर सही रहे।

C Language
#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;
}
Output:
10 20 30
⚠️ हमेशा NULL जाँचें

अगर system memory न दे सके, तो malloc NULL लौटाता है। NULL pointer इस्तेमाल करने से program crash होता है, इसलिए इस्तेमाल से पहले जाँचें।

calloc: allocate और zero

calloc malloc जैसा है पर memory को 0 भी कर देता है, और यह count तथा element size अलग-अलग लेता है।

C Language
#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;
}
Output:
0 0 0

malloc के साथ ये values garbage होतीं। जब साफ़, zero शुरुआत चाहिए तब calloc इस्तेमाल करें।

realloc: block resize

मान लीजिए आपने 3 ints की जगह ली पर अब 5 चाहिए। realloc block बड़ा करता है, पुरानी values रखते हुए।

C Language
#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;
}
Output:
1 2 3 4 5
💡 सुरक्षित realloc

realloc block को हिला सकता है, इसलिए हमेशा उसका result किसी pointer में वापस assign करें (बेहतर हो कि एक temporary में जिसे आप जाँचें), यह मानकर न चलें कि पुराना pointer अब भी valid है।

free और memory leaks

हर block जो आप allocate करते हैं उसे free से छोड़ना होगा। अगर भूल गए, तो वह memory program खत्म होने तक आरक्षित रहती है — एक memory leak। घंटों चलने वाले program में leaks इकट्ठा होकर उसे crash कर सकते हैं।

C Language
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 माँगने देती है।
  • malloc allocate करता है (garbage); calloc allocate करके zero करता है।
  • realloc block resize करता है और हिला सकता है — उसका result दोबारा assign करें।
  • हर allocation के लिए एक मेल खाता free चाहिए, वरना memory leak होता है।
  • NULL जाँचें, और free के बाद pointers को NULL करें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

C में dynamic memory allocation क्या है?
Dynamic memory allocation यानी program चलते समय memory माँगना, न कि code लिखते समय size तय करना। यह malloc और calloc जैसे functions से heap नामक क्षेत्र से memory लेता है और आपको उसका pointer देता है। इससे आपका program उतनी data संभाल सकता है जितनी आपको पहले से पता नहीं थी।
malloc और calloc में क्या अंतर है?
दोनों heap पर memory allocate करते हैं, पर malloc memory को uninitialised छोड़ता है (उसमें garbage रहता है), जबकि calloc हर byte को zero कर देता है। साथ ही malloc एक कुल size argument लेता है, जबकि calloc elements की संख्या और हर एक का size अलग-अलग लेता है।
C में memory leak क्या है?
Memory leak तब होता है जब आप malloc या calloc से memory लेते हैं पर उस पर कभी free नहीं करते। वह memory program खत्म होने तक आरक्षित और अनुपयोगी रहती है। लंबे समय चलने वाले programs में बार-बार के leaks धीरे-धीरे सारी उपलब्ध memory खा जाते हैं।
C में realloc क्या करता है?
realloc पहले से allocate किए block का size बदलता है — जैसे और जगह चाहिए तो array बड़ा करना। यह block को नई जगह ले जा सकता है और नया pointer लौटाता है, इसलिए हमेशा उसका result वापस assign करें और इस्तेमाल से पहले जाँचें।
Dangling pointer क्या है?
Dangling pointer वह pointer है जो अब भी उस memory का address रखता है जो पहले ही free हो चुकी है। इसे इस्तेमाल करने से undefined behaviour और crash होता है। सुरक्षित आदत यह है कि free करने के तुरंत बाद pointer को NULL कर दें, ताकि वह release हुई memory की ओर न इशारा करे।
← Back to C Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.