C लाइब्रेरी में malloc() फ़ंक्शन उदाहरण के साथ
⚡ स्मार्ट सारांश
C में malloc() फ़ंक्शन रनटाइम पर हीप पर मेमोरी का एक ब्लॉक आरक्षित करता है और इसके पहले बाइट के लिए एक वॉइड पॉइंटर लौटाता है, जिससे प्रोग्राम ऐसे स्टोरेज का अनुरोध कर सकते हैं जिसका आकार कोड के वास्तव में निष्पादित होने तक अज्ञात रहता है।
सी में malloc क्या है?
malloc() फ़ंक्शन मेमोरी आवंटन के लिए है। यह एक ऐसा फ़ंक्शन है जिसका उपयोग मेमोरी के ब्लॉक को गतिशील रूप से आवंटित करने के लिए किया जाता है। यह निर्दिष्ट आकार की मेमोरी स्पेस को सुरक्षित रखता है और मेमोरी लोकेशन की ओर इशारा करते हुए शून्य पॉइंटर लौटाता है। लौटाया गया पॉइंटर आमतौर पर void प्रकार का होता है। इसका मतलब है कि हम किसी भी पॉइंटर को 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() फ़ंक्शन के साथ वापस सौंपते हैं।


