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

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

C में malloc() फ़ंक्शन रनटाइम पर हीप पर मेमोरी का एक ब्लॉक आरक्षित करता है और इसके पहले बाइट के लिए एक वॉइड पॉइंटर लौटाता है, जिससे प्रोग्राम ऐसे स्टोरेज का अनुरोध कर सकते हैं जिसका आकार कोड के वास्तव में निष्पादित होने तक अज्ञात रहता है।

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

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

सी में malloc क्या है?

malloc() फ़ंक्शन मेमोरी आवंटन के लिए है। यह एक ऐसा फ़ंक्शन है जिसका उपयोग मेमोरी के ब्लॉक को गतिशील रूप से आवंटित करने के लिए किया जाता है। यह निर्दिष्ट आकार की मेमोरी स्पेस को सुरक्षित रखता है और मेमोरी लोकेशन की ओर इशारा करते हुए शून्य पॉइंटर लौटाता है। लौटाया गया पॉइंटर आमतौर पर void प्रकार का होता है। इसका मतलब है कि हम किसी भी पॉइंटर को malloc फ़ंक्शन असाइन कर सकते हैं।

सी में malloc क्या है?

वाक्य - विन्यास

ptr = (cast_type *) malloc (byte_size);

यहाँ,

  • ptr cast_type का सूचक है.
  • malloc फ़ंक्शन byte_size की आवंटित मेमोरी के लिए एक पॉइंटर लौटाता है।
Example: ptr = (int *) malloc (50)

जब यह कथन सफलतापूर्वक निष्पादित होता है, तो 50 बाइट्स का मेमोरी स्पेस आरक्षित हो जाता है। आरक्षित स्थान के पहले बाइट का पता int प्रकार के पॉइंटर ptr को असाइन किया जाता है।

malloc कार्यान्वयन का एक अन्य उदाहरण देखें:

#include <stdlib.h>
int main(){
int *ptr;
ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */
    if (ptr != NULL) {
      *(ptr + 5) = 480; /* assign 480 to sixth integer */
      printf("Value of the 6th integer is %d",*(ptr + 5));
    }
}

आउटपुट:

Value of the 6th integer is 480

ध्यान दें कि sizeof(int) के बजाय sizeof(*ptr) का उपयोग किया गया है ताकि बाद में *ptr घोषणा को किसी भिन्न डेटा प्रकार में टाइपकास्ट किए जाने पर कोड को अधिक मजबूत बनाया जा सके।

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

ध्यान रखें कि आवंटित मेमोरी सन्निहित है और इसे एक ऐरे के रूप में माना जा सकता है। हम इसका उपयोग कर सकते हैं। सूचक एरे के तत्वों को एक्सेस करने के लिए ब्रैकेट [ ] के बजाय अंकगणितीय विधि का उपयोग करें। हम एरे तत्वों को संदर्भित करने के लिए + का उपयोग करने की सलाह देते हैं क्योंकि ++ या += जैसे वृद्धिक चिह्नों का उपयोग करने से पॉइंटर द्वारा संग्रहीत पता बदल जाता है।

Malloc फ़ंक्शन का उपयोग कैरेक्टर डेटा प्रकार के साथ-साथ संरचनाओं जैसे जटिल डेटा प्रकारों के साथ भी किया जा सकता है।

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

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

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

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

क्योंकि आरक्षित ब्लॉक को एक पॉइंटर के रूप में वापस दिया जाता है, इसलिए इसे अंतर्निहित डेटा की प्रतिलिपि बनाए बिना ही कार्यों के बीच आसानी से पारित किया जा सकता है।

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

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

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

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

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

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

Keeping संतुलित तरीके से मेमोरी का आवंटन और रिलीज करना सी में मैन्युअल मेमोरी प्रबंधन का मूल सिद्धांत है, और यह मुक्त की गई मेमोरी के पुन: उपयोग के कारण होने वाले लीक और क्रैश दोनों को रोकता है।

malloc() बनाम calloc(): मुख्य अंतर

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

व्यवहारिक अंतर तीन मुख्य बिंदुओं पर आधारित हैं:

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

दोनों फ़ंक्शन stdlib.h में घोषित हैं, दोनों विफलता पर एक शून्य पॉइंटर या NULL लौटाते हैं, और दोनों अपनी मेमोरी को एक ही free() फ़ंक्शन के साथ वापस सौंपते हैं।

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

C में, कास्ट वैकल्पिक है और अक्सर इसे हतोत्साहित किया जाता है, क्योंकि void* स्वचालित रूप से किसी भी ऑब्जेक्ट पॉइंटर में परिवर्तित हो जाता है और एक स्पष्ट कास्ट stdlib.h के छूटे हुए समावेश को छिपा सकता है। C++हालांकि, कलाकारों की आवश्यकता है।

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

realloc() malloc() द्वारा पहले से आरक्षित ब्लॉक का आकार बदलता है, keeping छोटे आकार तक के मौजूदा डेटा का उपयोग करें। यदि यह विफल होता है, तो यह NULL लौटाता है और मूल ब्लॉक को अपरिवर्तित छोड़ देता है, इसलिए पहले इसके परिणाम को एक अस्थायी पॉइंटर को असाइन करें।

मेमोरी लीक तब होती है जब malloc() से प्राप्त हीप मेमोरी को free() से मुक्त नहीं किया जाता है। प्रोग्राम उस स्थान को आरक्षित रखता है जिसका वह अब उपयोग नहीं करता है, जिससे धीरे-धीरे उपलब्ध मेमोरी समाप्त हो सकती है।

malloc() फ़ंक्शन मेमोरी को हीप पर रिज़र्व करता है, स्टैक पर नहीं। हीप ब्लॉक तब तक मान्य रहते हैं जब तक आप free() फ़ंक्शन को कॉल नहीं करते, इसलिए वे उस फ़ंक्शन से भी ज़्यादा समय तक बने रह सकते हैं जिसने उन्हें बनाया है, जबकि स्टैक के स्वचालित वैरिएबल रिटर्न होने पर गायब हो जाते हैं।

malloc() एक लाइब्रेरी फ़ंक्शन है जो void* लौटाता है और बाइट्स की गणना करने के लिए sizeof की आवश्यकता होती है। C++ new एक ऑपरेटर है जो एक टाइप्ड पॉइंटर लौटाता है और कंस्ट्रक्टर को कॉल करता है। malloc() को free() के साथ और new को delete के साथ प्रयोग करें।

जी हां। एआई कोडिंग सहायक malloc() कॉल तैयार करते हैं, NULL चेक डालते हैं, और छूटे हुए free() कॉल या लीक को चिह्नित करते हैं, और वे पॉइंटर अंकगणित को समझा सकते हैं। जेनरेट किए गए कोड पर भरोसा करने से पहले हमेशा उसे कंपाइल और टेस्ट करें।

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

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