C भाषामा malloc फंक्शन | गतिशील मेमोरीको आधारदेखि प्रयोगसम्म

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. malloccalloc को भिन्नता

C भाषा मा, malloc बाहेक पनि मेमोरीलाई गतिशील रूपमा सुरक्षित गर्नका लागि फङ्क्शनहरू छन्। तिनमध्ये एक हो callocmalloccalloc धेरै समान छन्, तर केही महत्वपूर्ण भिन्नताहरू छन्। 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 प्रयोग गर्दा, शुरुआतीहरूले गर्ने सामान्य गल्तीहरूबारे पनि चर्चा गरौं। यी गल्तीहरूलाई टाढा राखेर, अधिक सुरक्षित र प्रभावकारी कार्यक्रम लेख्न सकिन्छ।
  1. मेमोरी मुक्त गर्न बिर्सनु डायनामिक रूपमा सुरक्षित गरिएको मेमोरीलाई free() द्वारा मुक्त गर्न बिर्सिएमा, मेमोरी लीक उत्पन्न हुन्छ। यो दीर्घकालीन चल्ने कार्यक्रमहरूमा विशेष गरी समस्या बन्न सक्छ। कति जटिल कार्यक्रम भए पनि, सुरक्षित गरिएको मेमोरीलाई अनिवार्य रूपमा मुक्त गर्ने बानी बनाऔं।
  2. NULL जाँचको उपेक्षा मेमोरी सुरक्षित गर्न असफल भएमा NULL फिर्ता हुन्छ भन्ने कुरा बिर्सनु सामान्य छ। मेमोरी सुरक्षित गरेपछि, अनिवार्य रूपमा NULL जाँच गर्नुहोस् र त्रुटि ह्यान्डलिङ्ग लागू गरौं।
  3. अप्रारम्भिक मेमोरीमा पहुँच गर्नु malloc द्वारा सुरक्षित गरिएको मेमोरी अप्रारम्भिक अवस्थामा हुन्छ। यदि त्यसलाई सिधै प्रयोग गरियो भने, अनपेक्षित व्यवहार उत्पन्न हुन सक्छ। विशेष गरी, यदि प्रारम्भिकरण आवश्यक छ भने calloc प्रयोग गर्ने विचार गर्नुहोस्।

10. सारांश

malloc C भाषामा एक शक्तिशाली उपकरण हो, मेमोरीलाई गतिशील रूपमा सुरक्षित गर्न आवश्यक छ। तर, यसको शक्ति सही रूपमा प्रयोग गर्नका लागि, ठोस समझ र उपयुक्त मेमोरी व्यवस्थापन आवश्यक छ। यस पटक प्रस्तुत गरिएको आधारभूत प्रयोगबाट संरचना र स्ट्रिङ्गमा प्रयोगसम्म, राम्रोसँग अभ्यासमा लागू गरौं। अर्को पटक प्रोग्राम लेख्दा, malloc द्वारा मेमोरी अर्डर गर्नुहोस्, र प्रयोग समाप्त भएपछि ठीकसँग फिर्ता गर्न नबिर्सनुहोस्! FAQ
  1. mallocले मेमोरी सुरक्षित गर्न नसकेमा, के गर्नु पर्छ? मेमोरी सुरक्षित गर्न असफल भएमा NULL फिर्ता हुन्छ, त्यसैले अनिवार्य रूपमा NULL जाँच गर्नुहोस्, र उपयुक्त त्रुटि ह्यान्डलिङ लागू गर्नुहोस्।
  2. malloccalloc मध्ये कुन प्रयोग गर्नु उपयुक्त? यदि आरम्भिकरण आवश्यक छैन भने malloc, मेमोरीलाई शून्य आरम्भिकरण गर्न चाहनुहुन्छ भने calloc उपयुक्त हुन्छ।
年収訴求