C Academy · पाठ

malloc और free

Heap पर आवंटन करें

पाठ 1, कुल 4 में से13 चरण

malloc और free, CoddyKit पर C Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

हीप

अब तक चर निश्चित जीवनकाल के साथ स्टैक पर रहते थे। हीप आपको रनटाइम पर मेमोरी माँगने और आवश्यकता के अनुसार उसे बनाए रखने देता है।

आप <stdlib.h> के फ़ंक्शन का इस्तेमाल करके हीप मेमोरी स्वयं प्रबंधित करते हैं।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = malloc(sizeof(int));
    *p = 99;
    printf("%d\n", *p);
    free(p);
    return 0;
}

malloc को कॉल करना

malloc(size) size बाइट आरक्षित करता है और उनका पॉइंटर लौटाता है, या विफल होने पर NULL लौटाता है।

मेमोरी आरंभित नहीं होती: इसकी सामग्री अनिश्चित होती है।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = malloc(sizeof(int));
    *p = 7;
    printf("value = %d\n", *p);
    free(p);
    return 0;
}

sizeof से आकार निर्धारित करना

कोड को हर प्लेटफ़ॉर्म पर सही रखने के लिए आवंटन का आकार हमेशा sizeof से निर्धारित कीजिए।

sizeof(*p) लिखने से आकार अपने-आप पॉइंटर के प्रकार से जुड़ जाता है।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    double *p = malloc(sizeof(*p));
    *p = 3.14;
    printf("%f\n", *p);
    free(p);
    return 0;
}

NULL की हमेशा जाँच कीजिए

यदि आवंटन विफल होता है, तो malloc NULL लौटाता है। इसे डीरेफ़रेंस करने पर प्रोग्राम क्रैश हो जाता है।

इस्तेमाल करने से पहले परिणाम की जाँच कीजिए।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = malloc(sizeof(int));
    if (p == NULL) {
        printf("allocation failed\n");
        return 1;
    }
    *p = 5;
    printf("ok: %d\n", *p);
    free(p);
    return 0;
}

ऐरे का आवंटन करना

कई एलिमेंट रखने के लिए, एलिमेंट के आकार को उनकी संख्या से गुणा कीजिए।

malloc(n * sizeof(int)) n पूर्णांकों के लिए स्थान बनाता है।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 5;
    int *arr = malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) arr[i] = i * i;
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\n");
    free(arr);
    return 0;
}

हीप ऐरे में पॉइंटर इंडेक्सिंग का इस्तेमाल होता है

हीप ऐरे को उसके पॉइंटर के माध्यम से परिचित arr[i] सिंटैक्स से एक्सेस किया जाता है, जो *(arr + i) के समान है।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *arr = malloc(3 * sizeof(int));
    arr[0] = 10;
    *(arr + 1) = 20;
    arr[2] = 30;
    printf("%d %d %d\n", arr[0], arr[1], arr[2]);
    free(arr);
    return 0;
}

मेमोरी मुक्त करना

free(p) ब्लॉक को आवंटक को वापस कर देता है। इसके बाद उस मेमोरी तक पहुँचने के लिए p का इस्तेमाल नहीं करना चाहिए।

हर सफल malloc के लिए एक संबंधित free आवश्यक है।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *buf = malloc(16);
    if (buf) {
        buf[0] = 'A';
        printf("%c\n", buf[0]);
        free(buf);
    }
    return 0;
}

free(NULL) सुरक्षित है

NULL पॉइंटर पर free को कॉल करने से कुछ नहीं होता और यह पूरी तरह वैध है।

इससे वह सफ़ाई कोड सरल हो जाता है जो आवंटन सफल होने से पहले चल सकता है।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = NULL;
    free(p);
    printf("free(NULL) was safe\n");
    return 0;
}

हीप मेमोरी लौटाना

स्टैक चर के विपरीत, फ़ंक्शन के लौटने के बाद भी हीप मेमोरी बनी रहती है। इससे कोई फ़ंक्शन बफ़र आवंटित करके वापस दे सकता है।

#include <stdio.h>
#include <stdlib.h>

int *make_range(int n) {
    int *a = malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) a[i] = i;
    return a;
}

int main(void) {
    int *r = make_range(4);
    printf("%d %d\n", r[0], r[3]);
    free(r);
    return 0;
}

C में malloc का कास्ट न करें

C में malloc एक void * लौटाता है, जो अपने-आप किसी भी पॉइंटर प्रकार में बदल जाता है।

इसे कास्ट करना अनावश्यक है और इससे <stdlib.h> के छूटे हुए इंक्लूड की समस्या छिप सकती है।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    long *p = malloc(sizeof(long));
    *p = 1234567L;
    printf("%ld\n", *p);
    free(p);
    return 0;
}

दो बार मुक्त न करें

एक ही पॉइंटर पर दो बार free को कॉल करना अनिर्धारित व्यवहार है और हीप को दूषित कर सकता है।

मुक्त करने के बाद पॉइंटर को NULL पर सेट कीजिए, ताकि गलती से उसका दोबारा इस्तेमाल हानिरहित रहे।

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = malloc(sizeof(int));
    *p = 1;
    free(p);
    p = NULL;
    free(p);
    printf("no double free\n");
    return 0;
}

त्वरित जाँच

malloc और free के बारे में अपने ज्ञान की जाँच कीजिए।

पुनरावृत्ति

आपने हीप आवंटन की मूल बातें सीखीं:

  • malloc(size) आरंभ न किए गए बाइट आरक्षित करता है और विफल होने पर NULL लौटाता है।
  • परिणाम और आकार की जाँच हमेशा sizeof से कीजिए।
  • free(p) मेमोरी वापस करता है; हर malloc के लिए एक free आवश्यक है।
  • free(NULL) सुरक्षित है; दोहरा free अनिर्धारित है।
शुरुआत निःशुल्क

एआई शिक्षक के साथ C सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
39
पाठ
144

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

क्या “malloc और free” पाठ निःशुल्क है?

हाँ—“malloc और free” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“malloc और free” में मैं क्या सीखूँगा?

Heap पर आवंटन करें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“malloc और free” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. malloc और free
  2. calloc और realloc
  3. Memory Leaks
  4. Dangling Pointers
← C Academy पर वापस जाएँ