C भाषा में मेमोरी मैनेजमेंट Memory Management, Allocating Memory Dynamically, Resizing and Releasing Memory


C भाषा में मेमोरी मैनेजमेंट Memory Management


C भाषा में Memory Management के माध्यम से हम डाटा को कंप्यूटर की मेमोरी में संग्रहीत करते हैं और उसका उपयोग करते हैं। Memory Management उन तकनीकों को समझने के लिए आवश्यक है, जो कंप्यूटर की मेमोरी में डाटा को संग्रहित करने और उसे प्रबंधित करने में सक्षम होते हैं।

C में, हम मेमोरी का उपयोग करने के लिए अलग-अलग तरीके हैं। चाहे आपके पास मेमोरी स्टैटिक या डाइनामिक हो, आपको हमेशा उसका संभालना चाहिए।

अपने C कोड में, हम मेमोरी का उपयोग करने के लिए विभिन्न फ़ंक्शन जैसे malloc(), calloc(), realloc(), free() आदि का उपयोग कर सकते हैं। इन फ़ंक्शन का उपयोग करके हम डाटा के लिए मेमोरी स्पेस आवंटित कर सकते हैं और उसे स्वतंत्र रूप से विनियोजित कर सकते हैं।

इन फ़ंक्शन का उपयोग करने से पहले, हमें उन तकनीकों को समझना आवश्यक होता है, जो C में मेमोरी के लिए आवंटन करने और उसे स्वतंत्र रूप से विनियोजित करने में मदद करते हैं। यह उन्हें संभालने और संरक्षित रखने में मदद करता हैं।

Memory Management के लिए function 

C भाषा में Memory Management के लिए निम्नलिखित फ़ंक्शन हैं:

malloc(): यह फ़ंक्शन डाइनामिक मेमोरी आवंटित करता है। आप इसके माध्यम से जितनी भी मेमोरी चाहें वह आपको मिल सकती है। आप यह फ़ंक्शन इस्तेमाल करके int, char, float, double आदि तरह के वेरिएबल्स के लिए मेमोरी आवंटित कर सकते हैं।

calloc(): यह फ़ंक्शन डाइनामिक मेमोरी आवंटित करता है और सभी बाइट को 0 से शुरू करता है। इस फ़ंक्शन का उपयोग इस तरह के वेरिएबल्स के लिए किया जाता है जिन्हें आपको 0 से शुरू करने की आवश्यकता होती है।

realloc(): यह फ़ंक्शन डाइनामिक मेमोरी का आकार बदलने के लिए उपयोग किया जाता है। इसका उपयोग आप वहाँ कर सकते हैं जहाँ आपको नई आकार की मेमोरी आवश्यक होती है या फिर कोई आवंटित की गई मेमोरी की आवश्यकताओं को पूरा करने के लिए।

free(): यह फ़ंक्शन डाइनामिक मेमोरी को छोड़ता है। इसका उपयोग उन स्थितियों में किया जाता है जब आपको डाइनामिक मेमोरी का उपयोग अब आवश्यकता नहीं होती है।

Allocating Memory Dynamically 

C भाषा में, डाइनामिक मेमोरी आवंटन या Allocating Memory Dynamically, रनटाइम के दौरान प्रोग्राम के लिए मेमोरी आवंटित करने की प्रक्रिया होती है। यह अलग होता है स्टैटिक या ऑटोमेटिक मेमोरी आवंटित करने से, जो कंपाइल टाइम में होता है।

डाइनामिक मेमोरी आवंटन के लिए, प्रोग्रामर को स्वयं निर्धारित मेमोरी की आवश्यकता होती है जो रनटाइम में आवंटित की जाती है। इसमें, मेमोरी के लिए कोई फिक्स्ड साइज़ नहीं होती है और इसे प्रोग्राम के आवश्यकताओं के अनुसार बदला जा सकता है।

डाइनामिक मेमोरी आवंटित करने के लिए, C भाषा में दो विशेष फ़ंक्शन होते हैं: malloc() और calloc()। malloc() फ़ंक्शन डाइनामिक रूप से मेमोरी को आवंटित करता है, जबकि calloc() फ़ंक्शन डाइनामिक मेमोरी को 0 से भरता है। उनके बाद, realloc() फ़ंक्शन का उपयोग मेमोरी के आकार को बदलने के लिए किया जाता है। और अंत में, free() फ़ंक्शन का उपयोग मेमोरी को छोड़ने के लिए किया जाता है।


C भाषा में, डाइनामिक मेमोरी आवंटन या Allocating Memory Dynamically, प्रोग्राम के चलते समय के दौरान मेमोरी के रूप में संग्रहित करने की प्रक्रिया होती है। इस तरह की मेमोरी आवंटन में, मेमोरी का आकार रनटाइम में निर्धारित होता है और इसे प्रोग्राम के आवश्यकताओं के अनुसार बदला जा सकता है। इसका मुख्य उद्देश्य, यह होता है कि मेमोरी को प्रोग्राम के लिए निर्धारित करने में स्टैटिक और ऑटोमेटिक मेमोरी से अधिक उन्नतता प्रदान करना।

Allocating Memory Dynamically का उदाहरण


चलिए एक उदाहरण के माध्यम से C भाषा में Allocating Memory Dynamically को समझते हैं।

यदि हमें एक प्रोग्राम लिखना हो, जो प्रत्येक बार उपयोगकर्ता से एक संख्या लेता है और उस नंबर के अनुसार डायनेमिक रूप से एक सरणी का आकार निर्धारित करता है, तो हम दो तरीकों से इसे लिख सकते हैं:

तरीका 1:

#include <stdio.h>
int main() {
    int n;
    printf("Enter the size of the array: ");
    scanf("%d", &n); // Read the size of the array from user input

    int arr[n]; // Declare an array of size 'n'

    // use the array for further computations

    return 0;
}


यहां हमने प्रत्येक बार एक नया सरणी बनाने के लिए उपयोगकर्ता से एक संख्या पढ़ी है। इस तरह की संरचना को स्टैटिक मेमोरी आवंटन कहते हैं। यह तभी काम करता है जब हम बहुत कम आकार की सरणियों के साथ काम कर रहे होते हैं।

तरीका 2:


#include <stdio.h>
#include <stdlib.h>

int main() {
int n;
    printf("Enter the size of the array: ");
    scanf("%d", &n); // Read the size of the array from user input

    int *arr = (int*) malloc(n * sizeof(int)); // Allocate memory for the array of size 'n'

    // use the array for further computations

    free(arr); // free the dynamically allocated memory
    return 0;
}


यहां हमने malloc() फंक्शन का उपयोग करके एक नयी सरणी के लिए डायनेमिक मेमोरी आवंटित की है। इस तरह की संरचना को
डायनेमिक मेमोरी आवंटन कहते हैं।

Resizing and Releasing Memory

C भाषा में Resizing and Releasing Memory, डायनेमिक मेमोरी में आवंटित किए गए मेमोरी ब्लॉक का आकार बदलने या उसे मुक्त करने की क्रिया होती है।

Resizing Memory:
जब हमें डायनेमिक रूप से आवंटित मेमोरी ब्लॉक का आकार बदलना होता है, तो हम इसे realloc() फंक्शन का उपयोग करके करते हैं। realloc() फंक्शन का उपयोग करके हम डायनेमिक रूप से आवंटित मेमोरी ब्लॉक के आकार को बदल सकते हैं। realloc() फंक्शन का उपयोग एक मात्र पैरामीटर के रूप में मूल मेमोरी ब्लॉक का पता देते हुए किया जाता है। realloc() फंक्शन का उपयोग करके, हम एक नए आकार का मेमोरी ब्लॉक आवंटित कर सकते हैं और मूल मेमोरी ब्लॉक की जगह पर नए ब्लॉक के पते को वापस कर सकते हैं।

Releasing Memory:
जब हम डायनेमिक रूप से आवंटित मेमोरी ब्लॉक का उपयोग नहीं कर रहे होते हैं तो हम उसे free() फंक्शन का उपयोग करके मुक्त करते हैं। free() फंक्शन का उपयोग करने से, हम डायनेमिक रूप से आवंटित मेमोरी ब्लॉक को सिस्टम के उपलब्ध मेमोरी में वापस कर सकते हैं।

Resizing and Releasing Memory का उदाहरण

एक उदाहरण है जो realloc() फंक्शन का उपयोग करके आवंटित मेमोरी ब्लॉक के आकार को बदलने और free() फंक्शन का उपयोग करके मेमोरी ब्लॉक को मुक्त करने को दिखाता है।

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *arr, size1, size2;
    printf("Enter the size of the array: ");
    scanf("%d", &size1);

    // Allocate memory dynamically for the array
    arr = (int*) malloc(size1 * sizeof(int));
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 0;
    }

    // Print the allocated array
    printf("The array is: ");
    for (int i = 0; i < size1; i++) {
        arr[i] = i;
        printf("%d ", arr[i]);
    }
    printf("\n");

    // Resize the array
    printf("Enter the new size of the array: ");
    scanf("%d", &size2);
    arr = (int*) realloc(arr, size2 * sizeof(int));
    if (arr == NULL) {
        printf("Memory reallocation failed\n");
        return 0;
    }

    // Print the resized array
    printf("The resized array is: ");
    for (int i = 0; i < size2; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // Free the memory allocated for the array
    free(arr);
    printf("Memory has been freed\n");

    return 0;
}


इस उदाहरण में, सबसे पहले, हम उपयोगकर्ता से एक संख्या लेते हैं जो एक डायनेमिक मेमोरी ब्लॉक के आकार के लिए इस्तेमाल होगी। उसके बाद, हम उस आकार के लिए मेमोरी ब्लॉक आवंटित करते हैं और उसे प्रिंट करते हैं। फिर, हम उपयोगकर्ता से एक और संख्या लेते हैं जो नए आकार के लिए इस्तेमाल होगी। उसके बाद, हम realloc() फंक्शन का उपयोग करते हुए आवंटित मेमोरी ब्लॉक के आकार को बदलते हैं। उसके बाद, हम नये आकार के लिए रीसाइज्ड एरे को प्रिंट करते हैं। अंत में, हम उसी एरे के लिए मेमोरी को फ्री करते हैं।

यहां, यदि आप दिए गए संख्या के आकार से बड़ा नया आकार देते हैं तो realloc() फंक्शन आपको एक नए मेमोरी ब्लॉक के लिए आवंटन करता है और पहले आवंटित मेमोरी ब्लॉक में से डेटा को नए मेमोरी ब्लॉक में कॉपी करता है। यदि आप दिए गए संख्या के आकार से छोटा नया आकार देते हैं तो realloc() फंक्शन आपके द्वारा उपलब्ध कराए गए मेमोरी ब्लॉक के आकार को बदलता है लेकिन यह सुनिश्चित नहीं करता कि आपका पूर्व मेमोरी ब्लॉक नए आकार के लिए पर्याप्त होगा। इसका मतलब है कि जब आप realloc() फंक्शन का उपयोग करते हैं, तो आपको पुराने डायनेमिक मेमोरी ब्लॉक के आवंटित हिस्से को खो देने की संभावना होती है।

समान रूप से, free() फंक्शन का उपयोग उस मेमोरी ब्लॉक को मुक्त करने के लिए किया जाता है जो पहल आवंटित की गयी थी।