Dynamic Memory Allocation in C Programming in Hindi

इस tutorial में हम static memory allocation और dynamic memory allocation के बारे में बात करेंगे और सीखेंगे की कैसे आप C programming में dynamic memory allocation कर सकते हो और फिर उस dynamic memory को कैसे use कर सकते हो.

जब भी आप अपने programs में variables, constants या arrays declare करते हो तब programs के compile time पर ही उनके data types के हिसाब से computer memory में space allocate हो जाता है.

इस तरह program के compile time पर होने वाले memory allocation को static memory allocation कहा जाता है.

Static memory allocation में हमें पहले से ही पता होता है की exactly कितनी bytes memory allocate होगी और इस तरह की memory को हम static memory कहते हैं.

Static Memory Allocation के Disadvantages क्या हैं?

जैसा की आप जानते हो जब हमें किसी भी तरह के data type के 5-10 से ज्यादा values (records) को store करना होता है तब हम arrays का use करते हैं.

अब क्योंकि array declare करते वक्त ही हम उसका size बता देते हैं जिससे ये fixed हो जाता है की array maximum कितने elements store करेगा.

इसके बाद जब आप अपना program compile करते हैं तब array का size और data type के अनुसार array elements को store करने के लिए fixed size memory allocate कर दी जाती है.

अब इस तरह array के लिए की गयी static memory allocation में problem ये है की आप program को run करते वक्त यानी runtime पर आप उस memory को increase, decrease या free नहीं कर सकते हो.

जैसे आपने 100 numbers को store करने के लिए array बनाया और फिर program के runtime पर अगर आप इस array में 100 elements से ज्यादा store करना चाहो तो आप ऐसा नहीं कर सकते क्योंकि memory size static है.

इसके अलावा अगर आप उस array में सिर्फ 5 elements store करते हो तो जो बाकी के लिए 95 elements के लिए memory है वो waste हो रही है यानी वो फालतू में occupied है और आप उस memory को runtime पर decrease या free भी नहीं कर सकते हो.

इस तरह की problems से बचने के लिए C programming में dynamic memory allocation का feature भी दिया गया है.

Dynamic Memory Allocation क्या है?

जैसा की मैंने आपको ऊपर बताया की array का size fixed (static) होता है इसलिए ऐसा कोई program जिसमें आपको runtime पर ये बताना हो की आप कितने elements (records) store करना चाहते हो उसके लिए array का use करना सही choice नहीं है.

जब भी आप ऐसा program बनाना हो जिसमें program के runtime पर हमारे use के अनुसार memory allocation dynamically change हो. 

जैसे data inserations करने पर memory increase हो जाए और data deletion पर memory shrink हो जाए.

इस तरह के program को बनाने के लिए हम program में dynamic memory allocation का use करते हैं.

Dynamic memory allocation का सबसे बड़ा advanatage ये है की इससे हम बड़े programs में बहुत ज्यादा memory save कर सकते हैं.

C Programs में Dynamic Memory Allocation कैसे करते हैं?

C language में stdlib.h header file के अंदर 4 functions malloc(), calloc(), realloc(), free() मौजूद होते हैं जिनकी help से हम अपने C programs में dynamic memory allocation करते हैं.

इन functions को use करने के लिए आपको stdlib.h header file को अपने programs के top में include करना जरूरी होता है. आइये अब एक करके इन सभी functions का use example के साथ सीखते हैं.

malloc() function in C

malloc() function dynamic memory allocation में सबसे ज्यादा use होने वाला function है.

malloc() function की help से आप program execution के समय यानी runtime पर अपने use के हिसाब से memory (bytes) allocate कर सकते हो.

malloc() function syntax:

void * malloc(number_of_bytes);

ऊपर आप जो syntax देख रहे हैं वो malloc() function का standard syntax है लेकिन जब हम malloc() function को अपने program में use करते हैं तब उस statement का जो complete syntax होता है वो मैंने नीचे दिया है.

data_type ptr = (data_type *) malloc(sizeof(datatype));

malloc(sizeof(datatype)): जब आप malloc() function से किसी भी data type की N values को store करने के लिए memory allocate करना चाहते हो तब आपको पहले ये पता होना जरूरी है की उस data type की एक value कितनी bytes memory occupied करती है.

क्योंकि malloc() function की help से dynamic memory allocate करने के लिए हम malloc() function के parentheses ( ) में हम ये बताते हैं की हमें कितनी bytes memory allocate करनी है.

जैसे अगर आपको N integers के लिए जगह allocate करनी है तो पहले आपको ये पता करना होगा की 1 integer value कितना bytes space occupied करती है.

इससे ये फायदा होगा की आप 1 value की occupied bytes memory size का N numbers से multiply करके N integers के लिए memory allocate कर सकते हो.

C programming में किसी भी data type का size पता करने के लिए हम sizeof() function का use करते हैं. इस function की अधिक जानकारी के लिए पहले आप नीचे दिए गए link पर click करके tutorial जरूर पढ़ लें.

Read: sizeof() function in C programming in Hindi

(data_type *): जैसा की मैंने बताया की malloc() function memory allocate करने के बाद memory के starting address को void pointer को assign कर देता है और फिर उस void pointer को आपको return करता है.

उस void pointer को आप type cast करके उस data type के pointer में cast करना होता है जिस data type के pointer में आप allocated memory के address को assign करना चाहते हो.

Read: void pointer in C programming in Hindi

Note: अगर malloc() function memory allocate करने fail (विफल) हो जाता है तब ये function NULL value return करता है.

malloc() function example program:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,n,*ptr;

    printf("Enter Number of Elements : ");
    scanf("%d",&n);

    ptr=(int *)malloc(n*sizeof(int));

    if(ptr==NULL)
    {
        printf("Memory Not Allocated");
    }
    else
    {
        for(i=0;i<n;i++)
        {
            printf("Enter Element : ");
            scanf("%d",ptr+i);
        }

        printf("All Elements : ");
        for(i=0;i<n;i++)
        {
            printf("%d ",*(ptr+i));
        }

        free(ptr);
    }

    return 0;
}

Output:

Enter Number of Elements : 5
Enter Element : 47
Enter Element : 76
Enter Element : 34
Enter Element : 53
Enter Element : 75
All Elements : 47 76 34 53 75

calloc() function in C

calloc() function का use भी malloc() function की तरह dynamic memory allocation के लिए ही होता है.

ज्यादातर programmers malloc() function का ही use करते हैं क्योंकि malloc() function calloc() function से fast माना जाता है.

malloc() function को use करते वक्त हम सिर्फ एक argument pass करते हैं और calloc() function को use करते वक्त हम 2 arguments pass करते हैं.

malloc() function से किसी भी data type के N elements के लिए memory allocate करने के लिए हम N number का उस data type के size से multiply करते हैं.

malloc() function में जो काम हम एक ही argument में कर देते हैं यानी N number का data type के size से multiply same ये ही काम calloc() function में 2 arguments में किया जाता है.

calloc() function syntax:

void * calloc(number_of_element (N), sizeof(datatype));

ऊपर आप जो syntax देख रहे हैं वो calloc() function का standard syntax है लेकिन जब हम calloc() function को अपने program में use करते हैं तब उस statement का जो complete syntax होता है वो मैंने नीचे दिया है.

data_type ptr = (data_type *) calloc(N, sizeof(datatype));

calloc() function example program:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,n,*ptr;

    printf("Enter Number of Elements : ");
    scanf("%d",&n);

    ptr=(int *)calloc(n,sizeof(int));

    if(ptr==NULL)
    {
        printf("Memory Not Allocated");
    }
    else
    {
        for(i=0;i<n;i++)
        {
            printf("Enter Element : ");
            scanf("%d",ptr+i);
        }

        printf("All Elements : ");
        for(i=0;i<n;i++)
        {
            printf("%d ",*(ptr+i));
        }

        free(ptr);
    }

    return 0;
}

Output:

Enter Number of Elements : 4
Enter Element : 56
Enter Element : 76
Enter Element : 45
Enter Element : 43
All Elements : 56 76 45 43

realloc() function in C

कभी-कभी C programs में ऐसा होता है की malloc() function या calloc() function की help से हमने जो memory allocated कर दी है उस memory को program के runtime पर ही resize यानी कम या ज्यादा करना होता है.

C programming में इस काम के लिए हम realloc function का use करते हैं और इसका use तो आप इसके नाम re-allocation से ही समझ सकते हो.

realloc() function पहले से allocated memory को resize करते वक्त ही उस memory में मौजूद data को reallocated (new) memory में move कर देता है.

realloc() function syntax:

void* realloc(ptr, new_size);

ऊपर आप जो syntax देख रहे हैं वो realloc() function का standard syntax है लेकिन जब हम realloc() function को अपने program में use करते हैं तब उस statement का जो complete syntax होता है वो मैंने नीचे दिया है.

data_type ptr = (data_type *) realloc(ptr, N*sizeof(datatype));

ऊपर syntax में realloc() function के अंदर जो ptr है ये वो pointer variable होता है जो उस allocated memory को point (store) कर रहा होता है जो हमने malloc() या calloc() function से memory allocated की थी.

realloc() function example program:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,n,m,*ptr;

    printf("Enter Number of Elements : ");
    scanf("%d",&n);

    ptr=(int *)malloc(n*sizeof(int));

    for(i=0;i<n;i++)
    {
        printf("Enter Element : ");
        scanf("%d",ptr+i);
    }

    printf("Enter Number of Elements : ");
    scanf("%d",&m);

    ptr=(int *)realloc(ptr,m*sizeof(int));

    for(i=n;i<m;i++)
    {
        printf("Enter Element : ");
        scanf("%d",ptr+i);
    }

    printf("All Elements : ");
    for(i=0;i<m;i++)
    {
        printf("%d ",*(ptr+i));
    }

    free(ptr);

    return 0;
}

Output:

Enter Number of Elements : 3
Enter Element : 12
Enter Element : 34
Enter Element : 54
Enter Number of Elements : 5
Enter Element : 76
Enter Element : 22
All Elements : 12 34 54 76 22

Explanation:

हमारे program के output के हिसाब से user ने पहले 3 element input के लिए बोला और इसके लिए हमने malloc() function से 3 यानी N elements के लिए memory allocate कर दी.

लेकिन line 19 user ने variable m में input करके बताया की वो total 5 elements input करना चाहता है. 

इसलिए हमने line 21 पर realloc() function से total 5 (m) element के लिए फिर से memory allocate की. 

अब internally होगा ये pointer ptr के पहले 3 elements new allocated memory में move कर दिए जाएंगे और फिर आपको सिर्फ 2 और elements input लेने हैं और ये काम हमने काम line 23 पर मौजूद loop से किया है.

free() function in C

जब हम malloc(), calloc() और realloc() functions से dynamic memory allocation करते हैं तो उस reserved memory का use पूरा हो जाने के बाद उसे release भी करना होता है और इस काम के लिए हम free() function का use करते हैं .

Memory का काम पूरा हो जाने के बाद उसे free करने से ये फायदा होता है की program के runtime पर ही आपको और new memory allocate करनी पड़ जाए तो memory shortage ना हो जाए.

free() function syntax:

free(pointer_variable);

हमने भी ऊपर सभी programs में dynamic memory का use पूरा हो जाने के बाद उसे last में free() function से free (release) किया है.

What’s Next: इस tutorial में हमने Pointer Arithmetic के बारे में पढ़ा. Next tutorial में हम C programming में File Handling करना सीखेंगे