Dynamic Memory Allocation

    Introduction

    जब हमें एक से अधिक Record को store करने होते हैं तो Array का प्रयोग किया जाता हैं। किन्तु एरे का प्रयोग तभी उपयुक्त है जब यह पहले से पता हो कि उसमें कितने Record store किए जाने हैं। ऐसी स्थिति में जब प्रोग्राम के रन होने से पूर्व यह पता लगाना संभव नहीं हो कि कुल कितने Record स्टोर किए जाने है, तो Dynamic Memory Allocation(डायनेमिक मैमोरी एलोकेशन) का प्रयोग किया जाता है।

    For Example एक Company Employees को higher करने  के लिए Interview रखती  है, किन्तु उसे यह पता नहीं होता है कि कितने व्यक्ति Interview के लिए आएंगे। उन व्यक्तियों की information को  स्टोर करने के लिए Array प्रयोग में लिया जा सकता है। ऐसे में Array का बड़ा आकार लेने में हो सकता है कि कम व्यक्ति ही Interview  के लिए उपस्थित हो। इससे मैमोरी अधिक खर्च होगी। दूसरी ओर यदि Array का छोटा आकार लिया जाए तो हो सकता है कि कुछ व्यक्तियों से सबंधित Information स्टोर ही नहीं हो पाए।

    इस समस्या का समाधान करने के लिए कुछ ऐसा किया जा सकता है कि Array का प्रयोग करने की बजाए जैसे ही नया रिकॉर्ड स्टोर करना हो वैसे ही केवल उसी Record को स्टोर करने के लिए Memory प्रयोग की जाए। इसे Dynamic Memory Allocation(डायनेमिक मैमोरी एलोकेशन)  कहा जाता है।

    Dynamic Memory Allocation in C Language 

    सामान्य Programs में सभी variables Program के प्रारंभ में ही Declare कर निश्चित मैमोरी को Allocate कर लिया जाता है। यह Static Memory Allocation(स्टेटिक मैमोरी एलोकेशन) कहलाता है। जबकि Dynamic Memory Allocation(डायनेमिक मैमोरी एलोकेशन) में Program के Run  होने के दौरान जब ज़रूरत होती है, उसी समय आवश्यकतानुसार मैमोरी को Allocate कर प्रयोग में लिया जाता है। लिंक लिस्ट के बारे में विस्तार से जानने से पूर्व यह जानना आवश्यक है कि C Language  में  Dynamic Memory किस प्रकार Allocate कर प्रयोग की जाती है।

    Important Function for Dynamic Memory Allocation 

    Memory (मैमोरी) को Program के Run होने के दौरान Allocate करने तथा आवश्यकता समाप्त होने पर उसे वापस Free करने के लिए C languages में निम्न फंक्शनों का प्रयोग किया जाता है:-

    malloc(....)

    इस Function को Allocate करवाने वाली Memory की Size  bytes में बताना होता है। यह बताई गई मैमोरी को Operation System (ऑपरेटिंग सिस्टम) से मांग कर उसे Allocate कर लेता है तथा Allocate Memory की Location का Address (पॉइंटर) return करता है।

    calloc(....)

    Array के लिए Memory Allocate करता है। इस Function को Allocate करवाने वाले Array तथा Array के प्रत्येक Elements द्वारा घेरे जाने वाली मैमोरी (बाइट्स में) बतानी होती है।
    यह बताए गए एरे के लिए मैमोरी को Operation System (ऑपरेटिंग सिस्टम) से मांग कर उसे Allocate कर लेता है तथा Allocate मैमोरी की Location का Address (पॉइंटर) return करता है। साथ ही साथ एरे के प्रत्येक Elements को 0 से Initialize भी कर देता है।

    realloc(....)

    पहले से Allocate की हुई Memory का Size increment या Decrement करने के लिए के इसका प्रयोग किया जाता है। मैमोरी में पहले से store Data को बचाते हुए यह Function नई Location का Address Return करता है, तथा Old Location को Free कर देता है।

    free(....)

    इसे एक Pointer (पॉइंटर) Input में दिया जाता है। यह उस Pointer (पॉइंटर) की Memory को free करते हुए वापस Operation System (ऑपरेटिंग सिस्टम) को लौटा देता है, ताकि अन्य प्रोग्राम उस मैमोरी का use कर सके।


    Program के Run होने के दौरान Memory Allocate करवाने के लिए malloc() का प्रयोग किया जाता है। इसका प्रारूप निम्न प्रकार है:

    pointer_variable = (type cast)malloc(size in bytes);  

    ........malloc (size in bytes):- 

    Data को स्टोर करने के लिए हमें जितने Bytes की आवश्यकता होती है वह हमें इस फंक्शन को इनपुट में देनी होती है। यह फंक्शन मांगी गई Bytes को Allocate करते हुए उसके प्रथम मैमोरी का Address  (पॉइंटर) Return करता है। चूंकि जब भी पॉइंटर का प्रयोग किया जाता है तो यह भी बताना होता है कि वह Pointer किस Data Type को point (पॉइंट) कर रहा है। यह कार्य Type coasting (टाइप कास्टिंग) के माध्यम से निम्न प्रकार किया जाता है:

    (datatype *)malloc(size in bytes);

    अब यह कहा जा सकता है कि उपरोक्त Expiration (एक्सप्रेशन) किसी Data-type (डेटा टाइप) को point (पॉइंट) करते हुए Pointer (पॉइंटर) Return (रिटर्न) कर रहा है। इसे हमें समान Data-type (डेटा टाइप) को point (पॉइंट) करने वाले Pointer (पॉइंटर) Variable (वेरिएबल) में Store करवाना होगा।
    निम्न उदाहरण देखिए:


        int *pi;
        pi = (int *)malloc(2);

    उपरोक्त उदाहरण में मैमोरी में 2 bytes Allocate करते हुए एक Pointer (पॉइंटर) Return (रिटर्न) होगा, जो किसी भी Data-type (डेटा टाइप) को point (पॉइंट) पॉइंट करते हुए नहीं होगा, किंतु (int *) के माध्यम से वह Data-type (डेटा टाइप) को point (पॉइंट) अब int Data-type (डेटा टाइप) को point (पॉइंट) करने वाले Pointer (पॉइंटर) में बदल जाएगा। अतः इस Integer Pointer (इंटीजर पॉइंटर) को स्टोर करने के लिए हमने pi पॉइंटर प्रयोग किया है। संपूर्ण रूप से यह कहा जा सकता है कि उपरोक्त उदाहरण में 2 byte Integer को स्टोर करने के लिए Memory Allocate की जा रही है। अब इस Pointer pi के माध्यम से मैमोरी में एक Integer Value स्टोर करवाई जा सकती है।

    Example:-


        #include<conio.h>
        #include<stdio.h>
        #include <stdlib.h>
        void main(){
            int *pi;
            float *pf;

            pi = (int *)malloc(sizeof(int));
            pf = (float *)malloc(sizeof(float));

            *pi = 5282;
            *pf = 248.523;
            printf("\n%d", *pi);
            printf("\n%f", *pf);
            getch();
        }
       

    Output:-

    5282
    248.523000

    Explain Example:-

    उपरोक्त उदाहरण में एक Integer तथा एक Float value  को Store करवाने के लिए malloc() का प्रयोग किया गया है। इस Function  में sizeof (...) Operator स्वतः संबंधित Data type (डेटा टाइप) द्वारा घेरे जाने वाली space बता देगा।

    यह ध्यान रखें कि malloc() द्वारा रिटर्न की जाने वाली Space मैमोरी में लगातार contiguous होती हैं। अतः यदि मैमोरी में Request गई space contiguous में उपलब्ध नहीं होगी तो malloc() द्वारा null Return किया जाएगा।
    उपरोक्त उदाहरण में एक Integer Value तथा एक Float Value के लिए Allocation करवाया गया है। यह कार्य एक से अधिक वैल्यू के लिए भी करवाया जा सकता है। 

    For Example:-


        int *pi;
        pi = (int *)malloc(sizeof(int) * 5);

    उपरोक्त उदाहरण में 5 Integer Value को स्टोर करवाने के लिए Memory(मैमोरी)  Allocation (एलोकेशन) किया गया है।

    free up memory

    जब भी किसी Variable (वेरिएबल) के लिए Memory (मैमोरी) Allocation (एलोकेशन) होती है तो वह संबंधित Block या Program की समाप्ति पर ही free होती है। अर्थात् उस Time Duration में उस मैमोरी का प्रयोग कोई अन्य Program नहीं कर सकता है। ऐसे Variable (वेरिएबल) जिनकी हमें Program में आगे आवश्यकता नहीं हो, उसको Free कर दिया जाना चाहिए। Memory(मैमोरी) को free करने के लिए free (...) फंक्शन प्रयोग किया जाता है, जिसका प्रारूप निम्न प्रकार है:

    free(pointer_variable) ;

    उपरोक्त प्रारूप में pointer_variable उस मैमोरी स्थान को Denote  करता है, जिसे Free किया जाना  हैं। 


        int *pi;
        pi = (int *)malloc(sizeof(int) * 5);
        .......
        free(pi);

    उपरोक्त उदाहरण में free(pi) 5 Integer Number द्वारा घेरे जाने वाली Memory को Free कर देगा।

    Example:-


        #include <conio.h>
        #include <stdio.h>
        #include <stdlib.h>
        struct emp
        {
            char name[30];
            int age;
        };
        void main()
        {
            struct emp *pEmp;
            pEmp = (struct emp *)malloc(sizeof(struct emp));
            if (pEmp == NULL) // indicating filure of memory allocation
            {
                exit(1);
            }

            // getting values from user
            printf("Enter Emloyee Name : ");
            scanf("%s", &pEmp->name);
            printf("Enter Emloyee Age : ");
            scanf("%d", &pEmp->age);

            // Diplaying values back to screen :
            printf("\nName : %s", pEmp->name);
            printf("\nAge : %d", pEmp->age);

            getch();
        }

    Output:-

    Enter Emloyee Name : Muksa
    Enter Emloyee Age : 20

    Name : Muksa
    Age : 20

    उपरोक्त उदाहरण में चूंकि Structure (स्ट्रक्चर) Member  को Pointer के माध्यम से प्रयोग किया जा रहा है.. अतः dot(.) की जगह पर (->) का प्रयोग किया गया है।

    Post a Comment

    0 Comments