目次
- 1 1. परिचय
- 2 2. malloc के हो?
- 3 3. malloc को मूलभूत प्रयोग
- 4 4. free()को मेमोरी मुक्त गर्ने महत्त्व
- 5 5. NULL जाँच गर्ने महत्त्व
- 6 6. malloc र calloc को भिन्नता
- 7 7. व्यावहारिक उदाहरण: malloc प्रयोग गरेर स्ट्रिङको गतिशील आवंटन
- 8 8. संरचनाहरूमा malloc को प्रयोग
- 9 9. malloc को प्रयोग गर्दा सामान्यतया हुने गल्तीहरू
- 10 10. सारांश
1. परिचय
C भाषा मा प्रोग्राम लेख्न सुरु गर्दा, सुरुमा एरेज जस्ता प्रयोग गरेर मेमोरी ह्यान्डल गर्ने धेरै हुन्छ। तर, प्रोग्राम जटिल हुँदै जाँदा, अधिक लचिलो तरिकाले मेमोरी व्यवस्थापन गर्न चाहिने अवस्था आउँछ। त्यस्तो अवस्थामा काम आउने कुरा हो “डायनामिक मेमोरी एलोकेशन”。malloc
यसको प्रतिनिधि कार्य हो, जसले प्रोग्राम चलिरहेको बेला आवश्यक मेमोरीलाई डायनामिक रूपमा एलोकेट गर्न सक्छ। उदाहरणका लागि, malloc
लाई “अर्डर गरेपछि बनाइने खाना” भनेर तुलना गर्न सकिन्छ। पूर्वनिर्धारित मेमोरी (एरे) लाई “बुफे शैलीको खाना” जस्तै भन्न सकिन्छ। तपाईंले चाहेको मात्रामा, malloc
मार्फत “अर्डर” गर्नुहुन्छ, र खाएपछि “प्लेट फाल्नु (free फङ्क्शनले मेमोरी मुक्त गर्नु)” हुन्छ, यो मूल प्रक्रिया हो। अब, यस लेखमा हामी malloc
बारे विस्तृत रूपमा हेर्नेछौं।2. malloc
के हो?
malloc
भनेको “memory allocation” (मेमोरी आवंटन) को संक्षिप्त रूप हो, र C भाषामा मेमोरीलाई गतिशील रूपमा सुरक्षित गर्न प्रयोग हुने कार्य हो। प्रोग्राम चलिरहेको बेला, निर्दिष्ट आकारको मेमोरी सुरक्षित गरी, त्यसको सुरुको ठेगाना फिर्ता गर्छ। यसले प्रोग्रामको कार्यकालमा आवश्यक अनुसारको मेमोरी प्रयोग गर्न सकिन्छ, र स्थिर आकारको एरेमा कठिन हुने लचिलो मेमोरी व्यवस्थापन सम्भव बनाउँछ। वास्तविक कोडमा, तलको जस्तै malloc
प्रयोग गरिन्छ।int *array = (int*)malloc(10 * sizeof(int));
यस उदाहरणमा, इन्टिजर प्रकारको एरे १० वटा सुरक्षित गरिएका छन्। यहाँ महत्वपूर्ण कुरा के हो भने, malloc
सुरक्षित गरिएको मेमोरीको सुरुको ठेगाना फिर्ता गर्छ, जसले गर्दा सिधै प्रयोग गर्दा प्रकार मिल्न नहुन सक्छ। त्यसैले, आवश्यक प्रकारमा कास्ट गर्नु सामान्य हो। उपरोक्तमा (int*)
प्रयोग गरेर इन्टिजर प्रकारको पोइन्टरमा कास्ट गरिएको छ।3. malloc
को मूलभूत प्रयोग
अब, malloc
को प्रयोगलाई अलि बिस्तारमा हेरौं। पहिलो, malloc
को सरल संरचना तलको जस्तै छ।void* malloc(size_t size);
malloc
फङ्क्शनले, तर्कको रूपमा सुरक्षित गर्न चाहेको मेमोरीको आकार (बाइट) लिन्छ। त्यसपछि, सो आकारको मेमोरी क्षेत्र सुरक्षित गर्छ, र सफल भएमा त्यस क्षेत्रको सुरुको ठेगाना फिर्ता गर्छ। फिर्ता हुने प्रकार void*
हो, अर्थात् जुनसुकै प्रकारमा कास्ट गर्न सकिने सामान्य पोइन्टर। उदाहरणका लागि, तलको जस्तै प्रयोग गरिन्छ।int *array = (int*)malloc(10 * sizeof(int));
यहाँ sizeof(int)
लाई, सुरक्षित गर्नुपर्ने मेमोरीको आकार गणना गर्न प्रयोग गरिन्छ। यसरी गर्दा, विभिन्न वातावरणहरूमा पनि सही आकारको मेमोरी सुरक्षित गर्न सकिन्छ। सुरक्षित गरिएको मेमोरी प्रयोग गरेपछि, अनिवार्य रूपमा free
फङ्क्शनले मुक्त गर्नु महत्त्वपूर्ण छ। नत्र, मेमोरी लीक भन्ने समस्या उत्पन्न हुन्छ।
4. free()
को मेमोरी मुक्त गर्ने महत्त्व
मेमोरीको गतिशील आवंटन उपयोगी छ भन्ने कुरा गलत छैन, तर एउटा ध्यान दिनुपर्ने कुरा छ। त्यो भनेको, आवंटन गरिएको मेमोरीलाई बिर्सनु नपर्ने गरी मुक्त गर्नुपर्छ भन्ने हो। यदि यो नगरेमा, मेमोरी लीक उत्पन्न हुन्छ, र प्रोग्रामले ठूलो मात्रामा मेमोरी बर्बाद गर्छ। malloc
द्वारा आवंटन गरिएको मेमोरीलाई, तलको जस्तै free()
द्वारा मुक्त गरिन्छ।free(array);
ुक्त नगरेको मेमोरी प्रोग्राम समाप्त नहुन्जेल सिस्टम स्रोतको रूपमा बाँकी रहन्छ, र दीर्घकालीन चल्ने प्रोग्रामहरूमा यो घातक समस्या बन्न सक्छ। भन्नुपर्दा, malloc
द्वारा उधारो लिएको थाललाई, free
द्वारा ठीकसँग फिर्ता नगरेमा भान्सा थालले भरिएजस्तै हुन्छ।5. NULL
जाँच गर्ने महत्त्व
malloc
फंक्शनले मेमोरी आवंटन असफल भएमा NULL
फिर्ता गर्छ। उदाहरणका लागि, यदि आवश्यक मेमोरी धेरै ठूलो छ र प्रणालीले आवंटन गर्न सक्दैन भने। malloc
प्रयोग गर्दा, यो NULL
जाँच गर्नु अनिवार्य छ, र मेमोरी सही रूपमा आवंटन भएको छ कि छैन जाँच्नु सुरक्षित प्रोग्राम लेख्ने तरिका हो।int *array = (int*)malloc(100000000 * sizeof(int));
if (array == NULL) {
// मेमोरी आवंटन असफल हुँदा गर्ने प्रक्रिया
printf("मेमोरी आवंटन असफल भयो।
");
return 1;
}
यसरी जाँच थपेर, मेमोरी आवंटन असफलताका लागि त्रुटि ह्यान्डलिङ सम्भव हुन्छ। कोडमा सानो सुरक्षा उपाय थपेर, पछि ठूलो समस्याहरूलाई रोक्न सकिन्छ।6. malloc
र calloc
को भिन्नता
C भाषा मा, malloc
बाहेक पनि मेमोरीलाई गतिशील रूपमा सुरक्षित गर्नका लागि फङ्क्शनहरू छन्। तिनमध्ये एक हो calloc
। malloc
र calloc
धेरै समान छन्, तर केही महत्वपूर्ण भिन्नताहरू छन्। malloc
ले निर्दिष्ट आकारको मेमोरी मात्र बाँड्छ, र यसको सामग्री प्रारम्भिक रूपमा अनइनिशियलाइज्ड रहन्छ। अर्कोतिर, calloc
ले मेमोरी सुरक्षित गर्दा साथसाथै बाँडिएको मेमोरीलाई सबै शून्यले इनिशियलाइज गर्छ।calloc
को प्रयोग
int *array = (int*)calloc(10, sizeof(int));
यो कोडले, इन्टिजर प्रकारको एरेलाई 10 वटा सुरक्षित गर्छ, र प्रत्येक तत्वलाई शून्यमा इनिशियलाइज गर्छ। malloc
सँगको मुख्य भिन्नता भनेको calloc
ले आर्गुमेन्टको रूपमा “तत्वको संख्या” र “तत्वको आकार” दुईवटा लिन्छ। यो संरचना उपयोगी हुने कारण हो, एरे जस्तै बहु-तत्व डेटा ह्यान्डल गर्दा, मेमोरीलाई अझ स्पष्ट रूपमा सुरक्षित गर्न सकिन्छ।
कुन प्रयोग गर्ने भन्ने कुरा परिस्थितिमा निर्भर गर्दछ, तर इनिशियलाइजेशन आवश्यक परेमा calloc
उपयोगी हुन्छ। उल्टो, इनिशियलाइजेशन आवश्यक नपरेमा वा प्रदर्शनलाई प्राथमिकता दिने अवस्थामा malloc
उपयुक्त हुन्छ।7. व्यावहारिक उदाहरण: malloc
प्रयोग गरेर स्ट्रिङको गतिशील आवंटन
यहाँ, वास्तविक रूपमा malloc
प्रयोग गरेर स्ट्रिङको गतिशील मेमोरी आवंटन हेर्नेछौं। C भाषामा स्ट्रिङ ह्यान्डल गर्दा सामान्यतया स्थिर आकारको एरे प्रयोग गरिन्छ। तर, स्ट्रिङको लम्बाइ रनटाइममा मात्र थाहा हुने अवस्थामा वा गतिशील रूपमा स्ट्रिङलाई सञ्चालन गर्न चाहँदा, malloc
उपयोगी हुन्छ।char *str = (char*)malloc(50 * sizeof(char));
if (str == NULL) {
printf("Memory allocation failed.
");
return 1;
}
sprintf(str, "Hello, World!");
printf("%s
", str);
free(str);
यो कोडमा, ५० अक्षरको मेमोरीलाई गतिशील रूपमा आवंटन गरी, त्यस क्षेत्रमा ”Hello, World!” स्ट्रिङ राखिएको छ। प्रयोग पछि free
फङ्क्शनले मेमोरी मुक्त गर्न नबिर्सनुहोस्। malloc
प्रयोग गरेर, स्थिर आकारको एरेमा सम्भव नहुने लचिलो मेमोरी व्यवस्थापन सम्भव हुन्छ।8. संरचनाहरूमा malloc
को प्रयोग
अगाडि, malloc
प्रयोग गरेर संरचनाको मेमोरीलाई गतिशील रूपमा सुरक्षित गर्ने उदाहरण हेर्नुहोस्। संरचना विभिन्न प्रकारका डेटा एकत्रित गरेर ह्यान्डल गर्न सक्ने शक्तिशाली डेटा प्रकार हो, तर यसको मेमोरी व्यवस्थापन पनि गतिशील रूपमा गर्न सम्भव छ।typedef struct {
int id;
char *name;
} Person;
Person *p = (Person*)malloc(sizeof(Person));
if (p == NULL) {
printf("Memory allocation failed.
");
return 1;
}
p->name = (char*)malloc(50 * sizeof(char));
sprintf(p->name, "John Doe");
p->id = 1;
printf("ID: %d, Name: %s
", p->id, p->name);
free(p->name);
free(p);
यस कोडमा, Person
नामक संरचनाको मेमोरीलाई गतिशील रूपमा सुरक्षित गरिन्छ, र यसको सदस्य भेरिएबल name
मा पनि थप मेमोरी गतिशील रूपमा सुरक्षित गरिन्छ। यसरी, संरचनाका प्रत्येक सदस्यमा आवश्यक अनुसार malloc
प्रयोग गरेर लचिलो रूपमा मेमोरी व्यवस्थापन गर्न सकिन्छ।9. malloc
को प्रयोग गर्दा सामान्यतया हुने गल्तीहरू
malloc
प्रयोग गर्दा, शुरुआतीहरूले गर्ने सामान्य गल्तीहरूबारे पनि चर्चा गरौं। यी गल्तीहरूलाई टाढा राखेर, अधिक सुरक्षित र प्रभावकारी कार्यक्रम लेख्न सकिन्छ।- मेमोरी मुक्त गर्न बिर्सनु डायनामिक रूपमा सुरक्षित गरिएको मेमोरीलाई
free()
द्वारा मुक्त गर्न बिर्सिएमा, मेमोरी लीक उत्पन्न हुन्छ। यो दीर्घकालीन चल्ने कार्यक्रमहरूमा विशेष गरी समस्या बन्न सक्छ। कति जटिल कार्यक्रम भए पनि, सुरक्षित गरिएको मेमोरीलाई अनिवार्य रूपमा मुक्त गर्ने बानी बनाऔं। NULL
जाँचको उपेक्षा मेमोरी सुरक्षित गर्न असफल भएमाNULL
फिर्ता हुन्छ भन्ने कुरा बिर्सनु सामान्य छ। मेमोरी सुरक्षित गरेपछि, अनिवार्य रूपमाNULL
जाँच गर्नुहोस् र त्रुटि ह्यान्डलिङ्ग लागू गरौं।- अप्रारम्भिक मेमोरीमा पहुँच गर्नु
malloc
द्वारा सुरक्षित गरिएको मेमोरी अप्रारम्भिक अवस्थामा हुन्छ। यदि त्यसलाई सिधै प्रयोग गरियो भने, अनपेक्षित व्यवहार उत्पन्न हुन सक्छ। विशेष गरी, यदि प्रारम्भिकरण आवश्यक छ भनेcalloc
प्रयोग गर्ने विचार गर्नुहोस्।
10. सारांश
malloc
C भाषामा एक शक्तिशाली उपकरण हो, मेमोरीलाई गतिशील रूपमा सुरक्षित गर्न आवश्यक छ। तर, यसको शक्ति सही रूपमा प्रयोग गर्नका लागि, ठोस समझ र उपयुक्त मेमोरी व्यवस्थापन आवश्यक छ। यस पटक प्रस्तुत गरिएको आधारभूत प्रयोगबाट संरचना र स्ट्रिङ्गमा प्रयोगसम्म, राम्रोसँग अभ्यासमा लागू गरौं। अर्को पटक प्रोग्राम लेख्दा, malloc
द्वारा मेमोरी अर्डर गर्नुहोस्, र प्रयोग समाप्त भएपछि ठीकसँग फिर्ता गर्न नबिर्सनुहोस्! FAQmalloc
ले मेमोरी सुरक्षित गर्न नसकेमा, के गर्नु पर्छ? मेमोरी सुरक्षित गर्न असफल भएमाNULL
फिर्ता हुन्छ, त्यसैले अनिवार्य रूपमाNULL
जाँच गर्नुहोस्, र उपयुक्त त्रुटि ह्यान्डलिङ लागू गर्नुहोस्।malloc
रcalloc
मध्ये कुन प्रयोग गर्नु उपयुक्त? यदि आरम्भिकरण आवश्यक छैन भनेmalloc
, मेमोरीलाई शून्य आरम्भिकरण गर्न चाहनुहुन्छ भनेcalloc
उपयुक्त हुन्छ।