Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

सी में डायनामिक मेमोरी आवंटन क्या है?

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

Function विवरण
void *calloc(int num, int size); यह फ़ंक्शन संख्या . की एक सरणी आवंटित करता है तत्व जिनमें से प्रत्येक का आकार बाइट्स में होगा।
शून्य मुक्त(शून्य *पता); यह फ़ंक्शन पते द्वारा निर्दिष्ट मेमोरी ब्लॉक का एक ब्लॉक जारी करता है।
void *malloc(int num); यह फ़ंक्शन संख्या . की एक सरणी आवंटित करता है बाइट्स और उन्हें अप्रारंभीकृत छोड़ दें।
void *realloc(void *address, int newsize); यह फ़ंक्शन स्मृति को newsize . तक विस्तारित करते हुए पुन:आवंटित करता है ।

मेमोरी को गतिशील रूप से आवंटित करना

प्रोग्रामिंग करते समय, यदि आप किसी सरणी के आकार से अवगत हैं, तो यह आसान है और आप इसे एक सरणी के रूप में परिभाषित कर सकते हैं। उदाहरण के लिए, किसी भी व्यक्ति का नाम स्टोर करने के लिए, यह अधिकतम 100 वर्णों तक जा सकता है, इसलिए आप कुछ इस प्रकार परिभाषित कर सकते हैं -

char name[100];

लेकिन अब हम एक ऐसी स्थिति पर विचार करें जहां आपको उस पाठ की लंबाई के बारे में कोई जानकारी नहीं है जिसे आपको संग्रहीत करने की आवश्यकता है, उदाहरण के लिए, आप किसी विषय के बारे में विस्तृत विवरण संग्रहीत करना चाहते हैं। यहां हमें यह निर्धारित किए बिना कि कितनी मेमोरी की आवश्यकता है, एक पॉइंटर टू कैरेक्टर को परिभाषित करने की आवश्यकता है और बाद में, आवश्यकता के आधार पर, हम मेमोरी आवंटित कर सकते हैं जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है -

उदाहरण कोड

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
   char name[100];
   char *description;
   strcpy(name, "Adam");
   /* allocate memory dynamically */
   description = malloc( 200 * sizeof(char) );
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   } else {
      strcpy( description, "Adam a DPS student in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
}

आउटपुट

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

कॉलोक () का उपयोग करके एक ही प्रोग्राम लिखा जा सकता है; केवल एक चीज है कि आपको मॉलोक को कॉलोक के साथ बदलने की आवश्यकता है -

calloc(200, sizeof(char));

तो आपके पास पूर्ण नियंत्रण है और आप स्मृति आवंटित करते समय किसी भी आकार मान को पारित कर सकते हैं, सरणी के विपरीत जहां आकार परिभाषित होने के बाद, आप इसे बदल नहीं सकते हैं।

स्मृति स्थानों का आकार बदलना

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

वैकल्पिक रूप से, आप फ़ंक्शन realloc () को कॉल करके आवंटित मेमोरी ब्लॉक के आकार को बढ़ा या घटा सकते हैं। आइए हम उपरोक्त प्रोग्राम को एक बार फिर से देखें और realloc() और free() फ़ंक्शंस का उपयोग करें -

उदाहरण कोड

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
   char name[100];
   char *description;
   strcpy(name, "Adam");
   /* allocate memory dynamically */
   description = malloc( 30 * sizeof(char) );
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   } else {
      strcpy( description, "Adam a DPS student.");
   }
   /* suppose you want to store bigger description */
   description = realloc( description, 100 * sizeof(char) );
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   } else {
      strcat( description, "He is in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
   /* release memory using free() function */
   free(description);
}

आउटपुट

Name = Adam
Description: Adam a DPS student.He is in class 10th

आप अतिरिक्त मेमोरी को फिर से आवंटित किए बिना उपरोक्त उदाहरण का प्रयास कर सकते हैं, और विवरण में उपलब्ध स्मृति की कमी के कारण strcat() फ़ंक्शन एक त्रुटि देगा।


  1. RAM (रैंडम एक्सेस मेमोरी) क्या है?

    रैंडम एक्सेस मेमोरी, या RAM (ramm . के रूप में उच्चारित) ), एक कंप्यूटर के अंदर का भौतिक हार्डवेयर है जो अस्थायी रूप से डेटा संग्रहीत करता है, जो कंप्यूटर की कार्यशील मेमोरी के रूप में कार्य करता है। अतिरिक्त RAM एक कंप्यूटर को एक ही समय में अधिक जानकारी के साथ काम करने की अनुमति देता है, जिसका आमत

  1. डायनामिक आईपी एड्रेस क्या है?

    एक गतिशील आईपी पता एक आईपी पता है जो स्वचालित रूप से प्रत्येक कनेक्शन, या नोड . को असाइन किया जाता है , किसी नेटवर्क का, जैसे आपका स्मार्टफ़ोन, डेस्कटॉप पीसी, या वायरलेस टैबलेट। IP पतों का यह स्वचालित असाइनमेंट एक DHCP सर्वर द्वारा पूरा किया जाता है। एक DHCP-सर्वर-असाइन किए गए IP पते को गतिशील . कह

  1. C प्रोग्रामिंग में स्टैटिक मेमोरी एलोकेशन से आप क्या समझते हैं?

    मेमोरी को निम्नलिखित दो तरीकों से आवंटित किया जा सकता है - स्थिर मेमोरी आवंटन स्थिर चर एक निश्चित आकार के आवंटित स्थान के एक ब्लॉक में परिभाषित करता है। एक बार आवंटित होने के बाद, इसे कभी भी मुक्त नहीं किया जा सकता है। प्रोग्राम में घोषित चर के लिए मेमोरी आवंटित की जाती है। पता & ऑपरेटर का उप