C Academy · पाठ

Array के लिए मेमोरी आवंटित करना

हीप मेमोरी आरक्षित करें।

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

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

डायनेमिक ऐरे क्यों

सामान्य ऐरे का आकार कंपाइल होने के समय तय होता है। लेकिन अक्सर प्रोग्राम चलने तक यह पता नहीं होता कि आपको कितने तत्वों की आवश्यकता होगी।

डायनेमिक ऐरे इस समस्या को हल करते हैं: आप malloc का उपयोग करके रनटाइम पर ऑपरेटिंग सिस्टम से मेमोरी का एक ब्लॉक माँगते हैं और किसी चर से उसका आकार तय करते हैं।

malloc से परिचय

malloc (मेमोरी आवंटन) <stdlib.h> में मौजूद है। आप इसे बाइट की संख्या देते हैं और यह उस ब्लॉक का पॉइंटर लौटाता है, या विफल होने पर NULL लौटाता है।

मेमोरी हीप से आती है और तब तक बनी रहती है जब तक आप उसे मुक्त नहीं कर देते।

int *p = malloc(10 * sizeof(int));

sizeof से आकार तय करना

बाइट की संख्या कभी सीधे न लिखें। sizeof का उपयोग करें, ताकि आपका कोड अलग-अलग प्लेटफ़ॉर्म पर भी सही रहे।

n पूर्णांकों के लिए जगह आवंटित करने हेतु n को sizeof(int) से गुणा करें। एक सामान्य तरीका n * sizeof(*p) है, जो पॉइंटर के अपने प्रकार का उपयोग करता है।

int *p = malloc(n * sizeof(*p));

NULL की हमेशा जाँच करें

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

उसे उपयोग करने से पहले परिणाम की जाँच करें। यह एक छोटी-सी आदत ऐसी अनेक त्रुटियों को रोकती है जिनका पता लगाना कठिन होता है।

int *p = malloc(n * sizeof(*p));
if (p == NULL) {
    fprintf(stderr, "out of memory\n");
    return 1;
}

एक संपूर्ण आवंटन

यह पूरा प्रोग्राम 5 पूर्णांकों के लिए जगह आवंटित करता है, उनमें मान भरता है और उन्हें प्रिंट करता है।

समरूपता पर ध्यान दें: शुरुआत में malloc और अंत में free।

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

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

malloc शून्य नहीं करता

malloc से मिलने वाली मेमोरी आरंभीकृत नहीं होती: उसमें पहले मौजूद कोई भी अनिश्चित डेटा हो सकता है।

उसे लिखने से पहले पढ़ने पर अप्रत्याशित मान मिलते हैं। पढ़ने से पहले हर तत्व को हमेशा कोई मान दें।

int *a = malloc(3 * sizeof(*a));
/* a[0], a[1], a[2] hold garbage here */
a[0] = 10;

calloc आपके लिए शून्य भरता है

calloc(count, size), size बाइट के count तत्वों के लिए जगह आवंटित करता है और हर बाइट को शून्य कर देता है।

जब आपको साफ़, शून्य से भरा ऐरे चाहिए, तब इसका उपयोग करें। यह गुणन में होने वाले अतिप्रवाह से भी बचाता है।

int *a = calloc(5, sizeof(*a));
/* every element is now 0 */

calloc का प्रयोग

यह प्रोग्राम calloc का उपयोग करता है और पुष्टि करता है कि ऐरे में बदलाव करने से पहले उसके सभी मान शून्य हैं।

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

int main(void) {
    int n = 4;
    int *a = calloc(n, sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

ब्लॉक में अनुक्रमण

हीप ब्लॉक का पॉइंटर ऐरे के नाम की तरह ही व्यवहार करता है। आप a[i] का उपयोग करके 0 से n-1 तक किसी भी तत्व को पढ़ और लिख सकते हैं।

अंदरूनी रूप से a[i], *(a + i) के समान ही है।

int *a = malloc(3 * sizeof(*a));
a[0] = 1;
*(a + 1) = 2;   /* same as a[1] = 2 */
a[2] = 3;

सीमाओं का ध्यान रखें

यदि आप n तत्व आवंटित करते हैं, तो मान्य अनुक्रमणिकाएँ 0 से n-1 तक होती हैं। a[n] में लिखना अपरिभाषित व्यवहार है।

C आपके लिए सीमाओं की जाँच नहीं करता, इसलिए सीमा से एक अधिक या कम का बग बिना सूचना दिए मेमोरी को बिगाड़ सकता है।

int *a = malloc(3 * sizeof(*a));
a[2] = 99;   /* OK, last valid index */
/* a[3] = 0;  BUG: out of bounds */

रनटाइम पर आकार पढ़ना

असल शक्ति यह है कि आकार आगत, किसी फ़ाइल या किसी गणना से आ सकता है। यही कोड 2 या 20 लाख तत्वों के लिए जगह आवंटित कर सकता है।

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

int main(void) {
    int n = 6;            /* could be scanf'd */
    long *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    long sum = 0;
    for (int i = 0; i < n; i++) { a[i] = i + 1; sum += a[i]; }
    printf("%ld\n", sum);
    free(a);
    return 0;
}

त्वरित जाँच

आवंटन की अपनी समझ जाँचें।

पुनरावलोकन

आप malloc(n * sizeof(*p)) से डायनेमिक ऐरे आवंटित करते हैं या calloc(n, sizeof(*p)) से शून्य-भरा ऐरे बनाते हैं।

हमेशा NULL की जाँच करें, याद रखें कि malloc अनिश्चित डेटा छोड़ता है, 0 से n-1 तक अनुक्रमण करें और हर आवंटन के साथ एक free अवश्य करें। अब आप डेटा को सुरक्षित रखते हुए किसी ब्लॉक का आकार बदलना सीखेंगे।

शुरुआत निःशुल्क

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

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

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

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

क्या “Array के लिए मेमोरी आवंटित करना” पाठ निःशुल्क है?

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

“Array के लिए मेमोरी आवंटित करना” में मैं क्या सीखूँगा?

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

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

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

“Array के लिए मेमोरी आवंटित करना” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. Array के लिए मेमोरी आवंटित करना
  2. realloc से बढ़ाना
  3. पुनः उपयोग योग्य Vector प्रकार
  4. मेमोरी मुक्त करना और लीक से बचना
← C Academy पर वापस जाएँ