C लाइब्रेरी में प्रोग्राम उदाहरण के साथ calloc() फ़ंक्शन

⚡ स्मार्ट सारांश

C में calloc() फंक्शन हीप पर मेमोरी के कई सन्निहित ब्लॉक आरक्षित करता है और प्रत्येक बाइट को शून्य से इनिशियलाइज़ करता है, एक वॉइड पॉइंटर लौटाता है जो प्रोग्राम को रनटाइम पर स्वच्छ, उपयोग के लिए तैयार एरे और डेटा संरचनाएं बनाने की अनुमति देता है।

  • 🧠 शून्य-आरंभित मेमोरी: calloc() प्रत्येक आवंटित बाइट को शून्य से साफ़ कर देता है, जबकि malloc() अप्रत्याशित गार्बेज मान छोड़ देता है।
  • 📦 दो तर्क: calloc(n, size) दिए गए आकार के n ब्लॉकों को एक सन्निहित क्षेत्र में आरक्षित करता है।
  • ⚠️ NULL जाँच: असफल आवंटन एक NULL पॉइंटर लौटाता है, इसलिए इसका उपयोग करने से पहले परिणाम को सत्यापित करें।
  • 🆚 calloc बनाम malloc: शून्य से भरे साफ-सुथरे एरे के लिए calloc() का चुनाव करें और जब आरंभीकरण की तुलना में गति अधिक मायने रखती हो तो malloc() का चुनाव करें।
  • 🧹 मेमोरी को मुक्त करें: मेमोरी लीक को रोकने के लिए प्रत्येक calloc() ब्लॉक को free() फ़ंक्शन से मुक्त करें।
  • 🤖 एआई सहायता: एआई सहायक और गिटहब कोपायलट कॉलॉक() कॉल का मसौदा तैयार करते हैं और अनुपस्थित फ्री() स्टेटमेंट को चिह्नित करते हैं।

C में calloc() फ़ंक्शन

C में calloc क्या है?

C में calloc() फ़ंक्शन का उपयोग समान आकार के कई मेमोरी ब्लॉक आवंटित करने के लिए किया जाता है। यह एक डायनामिक मेमोरी आवंटन फ़ंक्शन है जो एरे और स्ट्रक्चर जैसी जटिल डेटा संरचनाओं को मेमोरी स्पेस आवंटित करता है और मेमोरी का एक वॉइड पॉइंटर लौटाता है। calloc का अर्थ है सन्निहित आवंटन (contiguous allocation)।

मैलोक फ़ंक्शन मेमोरी स्पेस के एक ब्लॉक को आवंटित करने के लिए उपयोग किया जाता है जबकि C में calloc फ़ंक्शन का उपयोग मेमोरी स्पेस के कई ब्लॉक आवंटित करने के लिए किया जाता है। C प्रोग्रामिंग में calloc द्वारा आवंटित प्रत्येक ब्लॉक एक ही आकार का होता है।

C में calloc() का उपयोग क्यों करें?

सामान्य वैरिएबल और निश्चित आकार के एरे प्रोग्राम के संकलन के समय अपने आयामों को लॉक कर देते हैं, जिससे कम तत्वों की आवश्यकता होने पर स्थान की बर्बादी होती है और अधिक तत्वों की आवश्यकता होने पर प्रोग्राम पूरी तरह विफल हो जाता है। calloc() रनटाइम पर मेमोरी आरक्षित करके इस सीमा को हटा देता है और malloc() के विपरीत, ब्लॉक को वापस सौंपने से पहले प्रत्येक बाइट को शून्य कर देता है। यही कारण है कि जब भी किसी प्रोग्राम को किसी एरे या संरचना के लिए मेमोरी के एक स्वच्छ, अनुमानित क्षेत्र की आवश्यकता होती है, जिसका आकार केवल कोड चलने के दौरान ही ज्ञात होता है, तो calloc() एक स्वाभाविक विकल्प बन जाता है।

calloc() के साथ डायनामिक एलोकेशन कई सामान्य स्थितियों में उपयुक्त होता है:

  • संख्यात्मक सरणियाँ जो शून्य से शुरू होनी चाहिए, जैसे कि काउंटर, हिस्टोग्राम या रनिंग एक्यूमुलेटर।
  • डेटा संरचनाएं जहां बचे हुए कचरा मान सूक्ष्म, कठिन-tracऔर बग।
  • Bufferऐसी लंबाई जो उपयोगकर्ता द्वारा दिए गए इनपुट या प्रोग्राम चलने के दौरान पढ़ी गई फ़ाइल पर निर्भर करती है।
  • ब्लॉक सीमित स्टैक के लिए बहुत बड़े हैं, क्योंकि calloc() बहुत बड़े हीप से ब्लॉक लेता है।

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

calloc() सिंटैक्स:

ptr = (cast_type *) calloc (n, size);
  • C में calloc का उपरोक्त कथन उदाहरण समान आकार के n मेमोरी ब्लॉक आवंटित करने के लिए उपयोग किया जाता है।
  • मेमोरी स्पेस आवंटित होने के बाद, सभी बाइट्स को शून्य पर आरंभीकृत कर दिया जाता है।
  • RSI सूचक जो वर्तमान में आवंटित मेमोरी स्थान के पहले बाइट पर है, उसे लौटा दिया जाता है।

जब भी मेमोरी स्थान आबंटन में कोई त्रुटि होती है, जैसे मेमोरी की कमी, तो एक शून्य सूचक लौटाया जाता है जैसा कि नीचे दिए गए calloc उदाहरण में दिखाया गया है।

कॉलोक का उपयोग कैसे करें

सी में नीचे दिया गया calloc प्रोग्राम एक अंकगणितीय अनुक्रम का योगफल गणना करता है।

#include <stdio.h>
    int main() {
        int i, * ptr, sum = 0;
        ptr = calloc(10, sizeof(int));
        if (ptr == NULL) {
            printf("Error! memory not allocated.");
            exit(0);
        }
        printf("Building and calculating the sequence sum of the first 10 terms \ n ");
        for (i = 0; i < 10; ++i) { * (ptr + i) = i;
            sum += * (ptr + i);
        }
        printf("Sum = %d", sum);
        free(ptr);
        return 0;
    }

C उदाहरण में calloc का परिणाम:

 
Building and calculating the sequence sum of the first 10 terms
Sum = 45

calloc() और malloc() के बीच अंतर

calloc() और malloc() दोनों ही हीप पर मेमोरी आरक्षित करते हैं और दोनों ही शून्य पॉइंटर लौटाते हैं, या विफलता पर NULL लौटाते हैं, फिर भी वे तीन व्यावहारिक तरीकों से भिन्न हैं जो यह तय करते हैं कि किसका उपयोग करना है।

  • आरंभीकरण: calloc() नए ब्लॉक में प्रत्येक बाइट को शून्य पर सेट करता है, जबकि malloc() सामग्री को अनआरंभिक छोड़ देता है, इसलिए malloc() ब्लॉक में प्रोग्राम द्वारा लिखे जाने तक अप्रत्याशित कचरा डेटा रहता है।
  • आर्गुमेंट्स: calloc() दो आर्गुमेंट्स लेता है, तत्वों की संख्या और प्रत्येक का आकार, जिसे calloc(n, size) लिखा जाता है; malloc() एक आर्गुमेंट लेता है, बाइट्स की कुल संख्या, जिसे malloc(n * size) लिखा जाता है।
  • गति: malloc() थोड़ी तेज़ है क्योंकि यह शून्य करने के चरण को छोड़ देती है, यही कारण है कि जो कोड तुरंत मेमोरी को ओवरराइट करता है वह अक्सर इसे प्राथमिकता देता है।

दोनों फ़ंक्शन stdlib.h में घोषित हैं और दोनों ही अपनी मेमोरी को free() फ़ंक्शन से मुक्त करते हैं। जब एक साफ़, शून्य-मुक्त ब्लॉक महत्वपूर्ण हो, तो calloc() का उपयोग करें, और जब तेज़ गति को प्राथमिकता दी जाए और प्रोग्राम स्वयं आरंभीकरण को संभाले, तो malloc() का उपयोग करें।

calloc() द्वारा आवंटित मेमोरी को कैसे मुक्त करें

calloc() द्वारा आरक्षित मेमोरी हीप पर रहती है और कभी भी स्वचालित रूप से मुक्त नहीं होती। जब कोई प्रोग्राम बिना मुक्त किए लगातार मेमोरी आवंटित करता रहता है, तो वह धीरे-धीरे उपलब्ध मेमोरी को पूरी तरह से समाप्त कर देता है, जिसे मेमोरी लीक कहा जाता है। free() फ़ंक्शन एक पूर्ण ब्लॉक को सिस्टम को लौटा देता है ताकि बाद में आवंटन के लिए उस स्थान का पुनः उपयोग किया जा सके।

free() फ़ंक्शन एक ही आर्गुमेंट लेता है, जो calloc() द्वारा लौटाया गया पॉइंटर होता है, और पूरे ब्लॉक को एक साथ रिलीज़ कर देता है:

int *ptr;
ptr = calloc(10, sizeof(int));
if (ptr != NULL) {
    /* use the allocated memory here */
    free(ptr);   /* release the block */
    ptr = NULL;  /* avoid a dangling pointer */
}

calloc() मेमोरी को सुरक्षित रूप से प्रबंधित करने के लिए इन नियमों का पालन करें:

  • प्रत्येक सफल calloc() के लिए free() को ठीक एक बार कॉल करें; एक ही ब्लॉक को दो बार मुक्त करने से अनिश्चित व्यवहार होता है।
  • फ्री करने के बाद पॉइंटर को NULL पर सेट कर दें ताकि इसे डैंगलिंग पॉइंटर के रूप में दोबारा इस्तेमाल न किया जा सके।
  • कभी भी ऐसे पॉइंटर को free() न करें जिसे calloc() ने वापस नहीं किया हो, जिसमें पॉइंटर अंकगणित द्वारा शिफ्ट किया गया पॉइंटर भी शामिल है।
  • पॉइंटर के स्कोप से बाहर जाने से पहले प्रत्येक आवंटन को एक रिलीज के साथ मिलाएं।

क्योंकि calloc() और malloc() दोनों एक ही हीप से ब्लॉक लेते हैं, इसलिए दोनों फंक्शनों के लिए फ्री करने का नियम एक जैसा है: प्रत्येक सफल आवंटन के लिए एक free() फंक्शन, और उसके बाद ब्लॉक तक कोई पहुंच नहीं।ping संतुलित तरीके से मेमोरी का आवंटन और रिलीज करना C में मैन्युअल मेमोरी प्रबंधन का मूल सिद्धांत है, और यह मेमोरी लीक और पहले से वापस की जा चुकी मेमोरी के पुन: उपयोग के कारण होने वाले क्रैश दोनों को रोकता है।

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

calloc() को मानक लाइब्रेरी हेडर stdlib.h में घोषित किया गया है, इसलिए #include जोड़ें। स्रोत फ़ाइल के शीर्ष पर। इसके बिना, कंपाइलर एक अप्रत्यक्ष घोषणा के बारे में चेतावनी दे सकता है और लौटाए गए पॉइंटर को गलत तरीके से पढ़ सकता है।

जब हीप अनुरोध को पूरा नहीं कर पाता, तो calloc() एक मान्य पते के बजाय NULL पॉइंटर लौटाता है। इसका उपयोग करने से पहले हमेशा परिणाम की तुलना NULL से करें, क्योंकि NULL को डीरेफरेंस करने से अनिश्चित व्यवहार होता है और आमतौर पर प्रोग्राम क्रैश हो जाता है।

जी हां। calloc() फ़ंक्शन किसी भी प्रकार के डेटा के साथ काम करता है, जिसमें स्ट्रक्चर और स्ट्रक्चर के एरे भी शामिल हैं, बस इसमें एलिमेंट की संख्या और स्ट्रक्चर का आकार पास करना होता है। प्रत्येक सदस्य को शून्य कर दिया जाता है, जिससे मैन्युअल इनिशियलाइज़ेशन लूप के बिना एक साफ़ प्रारंभिक स्थिति प्राप्त होती है।

जी हां। realloc() calloc() या malloc() द्वारा लौटाए गए किसी भी पॉइंटर को स्वीकार करता है और मौजूदा डेटा को संरक्षित रखते हुए ब्लॉक को बढ़ाता या घटाता है। realloc() द्वारा जोड़े गए नए बाइट्स शून्य नहीं होते हैं, इसलिए यदि आवश्यक हो तो उन्हें स्वयं इनिशियलाइज़ करें।

इसका परिणाम कार्यान्वयन-परिभाषित है: calloc() NULL या एक अद्वितीय पॉइंटर लौटा सकता है जिसे डीरेफरेंस नहीं किया जा सकता है, लेकिन इसे free() में सुरक्षित रूप से पास किया जा सकता है। दोनों ही परिणामों को "उपयोग करने योग्य मेमोरी नहीं" मानें और उससे पढ़ने से बचें।

calloc() फ़ंक्शन अनुरोधित सभी तत्वों के लिए पर्याप्त आकार का एक निरंतर क्षेत्र आरक्षित करता है, जिससे वे सरणी कोशिकाओं की तरह एक दूसरे से जुड़े रहते हैं। नाम इस सन्निहित, साफ़ ब्लॉक को दर्शाता है, जिससे पॉइंटर अंकगणित मेमोरी में विश्वसनीय रूप से आगे बढ़ सकता है।

जी हां। AI कोडिंग सहायक calloc() फ़ंक्शन के लिए कोड तैयार करते हैं, NULL जांच जोड़ते हैं, और छूटे हुए free() फ़ंक्शन या कोड लीक को चिह्नित करते हैं, साथ ही वे पॉइंटर अंकगणित की व्याख्या भी करते हैं। उत्पादन में उपयोग करने से पहले हमेशा जेनरेट किए गए कोड को कंपाइल और टेस्ट करें।

गिटहब कोपिलॉट आपके इरादे का वर्णन करने वाली टिप्पणी से calloc(), sizeof() और उससे मेल खाने वाली free() लाइनें सुझाई गई हैं। Revसंकलन करने से पहले, छूटे हुए NULL चेक और लीक के लिए प्रत्येक सुझाव की समीक्षा करें।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: