यहां हम देखेंगे कि C में डायनामिक मेमोरी एलोकेशन क्या है। C प्रोग्रामिंग भाषा मेमोरी एलोकेशन और प्रबंधन के लिए कई फ़ंक्शंस प्रदान करती है। ये फ़ंक्शंस <stdlib.h> हेडर फ़ाइल में पाए जा सकते हैं। मेमोरी एलोकेशन के लिए निम्नलिखित फ़ंक्शंस हैं।
| फ़ंक्शन | विवरण |
|---|---|
| void *calloc(int num, int size); | यह फ़ंक्शन num तत्वों का एक ऐरे एलोकेट करता है जिनमें से प्रत्येक का आकार बाइट्स में size होगा। |
| void free(void *address); | यह फ़ंक्शन address द्वारा निर्दिष्ट मेमोरी ब्लॉक को रिलीज करता है। |
| void *malloc(int num); | यह फ़ंक्शन num बाइट्स का एक ऐरे एलोकेट करता है और उन्हें अनइनिशियलाइज़्ड छोड़ देता है। |
| void *realloc(void *address, int newsize); | यह फ़ंक्शन मेमोरी को newsize तक बढ़ाकर पुनः एलोकेट करता है। |
मेमोरी को डायनामिकली एलोकेट करना
प्रोग्रामिंग करते समय, यदि आप किसी ऐरे के आकार से अवगत हैं, तो यह आसान है और आप इसे ऐरे के रूप में परिभाषित कर सकते हैं। उदाहरण के लिए, किसी व्यक्ति का नाम स्टोर करने के लिए, यह अधिकतम 100 कैरेक्टर्स तक जा सकता है, इसलिए आप निम्नानुसार कुछ परिभाषित कर सकते हैं:
char name[100];
लेकिन अब एक ऐसी स्थिति पर विचार करें जहां आपको स्टोर करने के लिए आवश्यक टेक्स्ट की लंबाई के बारे में कोई अंदाजा नहीं है, उदाहरण के लिए, आप किसी विषय के बारे में विस्तृत विवरण स्टोर करना चाहते हैं। यहां हमें बिना यह परिभाषित किए कि कितनी मेमोरी आवश्यक है, कैरेक्टर के लिए एक पॉइंटर परिभाषित करने की आवश्यकता है और बाद में, आवश्यकता के आधार पर, हम नीचे दिए गए उदाहरण में दिखाए अनुसार मेमोरी एलोकेट कर सकते हैं:
उदाहरण कोड (malloc का उपयोग करके)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Adam");
/* डायनामिकली मेमोरी एलोकेट करें */
description = malloc(200 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "एरर - आवश्यक मेमोरी एलोकेट करने में असमर्थ\n");
} else {
strcpy(description, "Adam a DPS student in class 10th");
}
printf("Name = %s\n", name);
printf("Description: %s\n", description);
return 0;
}
आउटपुट
Name = Adam Description: Adam a DPS student in class 10th
उसी प्रोग्राम को calloc() का उपयोग करके लिखा जा सकता है; केवल एक चीज है कि आपको malloc को calloc से बदलना होगा:
calloc(200, sizeof(char));
इसलिए आपके पास पूरा नियंत्रण है और आप मेमोरी एलोकेट करते समय कोई भी आकार मान पास कर सकते हैं, ऐरे के विपरीत जहां एक बार आकार परिभाषित हो जाने पर आप इसे बदल नहीं सकते।
मेमोरी लोकेशन्स का आकार बदलना
जब आपका प्रोग्राम समाप्त होता है, तो ऑपरेटिंग सिस्टम आपके प्रोग्राम द्वारा एलोकेट की गई सभी मेमोरी को स्वचालित रूप से रिलीज कर देता है लेकिन एक अच्छी प्रैक्टिस के रूप में जब आपको मेमोरी की आवश्यकता नहीं होती तो आपको free() फ़ंक्शन को कॉल करके उस मेमोरी को रिलीज करना चाहिए।
वैकल्पिक रूप से, आप realloc() फ़ंक्शन को कॉल करके एलोकेटेड मेमोरी ब्लॉक के आकार को बढ़ा या घटा सकते हैं। आइए उपरोक्त प्रोग्राम को एक बार फिर जांचें और realloc() और free() फ़ंक्शंस का उपयोग करें:
उदाहरण कोड (realloc और free का उपयोग करके)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Adam");
/* डायनामिकली मेमोरी एलोकेट करें */
description = malloc(30 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "एरर - आवश्यक मेमोरी एलोकेट करने में असमर्थ\n");
} else {
strcpy(description, "Adam a DPS student.");
}
/* मान लीजिए आप बड़ा विवरण स्टोर करना चाहते हैं */
description = realloc(description, 100 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "एरर - आवश्यक मेमोरी एलोकेट करने में असमर्थ\n");
} else {
strcat(description, "He is in class 10th");
}
printf("Name = %s\n", name);
printf("Description: %s\n", description);
/* free() फ़ंक्शन का उपयोग करके मेमोरी रिलीज करें */
free(description);
return 0;
}
आउटपुट
Name = Adam Description: Adam a DPS student.He is in class 10th
आप उपरोक्त उदाहरण को अतिरिक्त मेमोरी को पुनः एलोकेट किए बिना आज़मा सकते हैं, और strcat() फ़ंक्शन description में उपलब्ध मेमोरी की कमी के कारण एरर देगा।