यहां हम देखेंगे कि सी में गतिशील स्मृति आवंटन क्या है। सी प्रोग्रामिंग भाषा स्मृति आवंटन और प्रबंधन के लिए कई कार्य प्रदान करती है। ये फ़ंक्शन
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() फ़ंक्शन एक त्रुटि देगा।