सी में गतिशील मेमोरी आवंटन: मॉलोक (), कॉलोक () फ़ंक्शंस

विषय - सूची:

Anonim

सी डायनामिक मेमोरी आवंटन सीखने से पहले, आइए समझते हैं:

C में मेमोरी मैनेजमेंट कैसे काम करता है?

जब आप एक बुनियादी डेटा प्रकार का उपयोग करके एक चर घोषित करते हैं, तो सी कंपाइलर मेमोरी के पूल में चर के लिए मेमोरी स्पेस को स्वचालित रूप से आवंटित करता है जिसे स्टैक कहा जाता है ।

उदाहरण के लिए, एक फ्लोट चर आमतौर पर 4 बाइट्स लेता है (मंच के अनुसार) जब यह घोषित किया जाता है। हम नीचे दिए गए उदाहरण में दिखाए गए आकार के ऑपरेटर का उपयोग करके इस जानकारी को सत्यापित कर सकते हैं

#include int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}

आउटपुट होगा:

 The size of float is 4 bytes 

इसके अलावा, एक निर्दिष्ट आकार के साथ एक सरणी को स्मृति के सन्निहित ब्लॉक में आवंटित किया जाता है, प्रत्येक ब्लॉक का एक तत्व के लिए आकार होता है:

#include int main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;} 

परिणाम है:

 The size of the float array with 10 element is 40

जैसा कि अब तक सीखा गया है, जब एक बुनियादी डेटा प्रकार या एक सरणी की घोषणा करते हैं, तो मेमोरी स्वचालित रूप से प्रबंधित होती है। हालाँकि, C में मेमोरी आवंटित करने के लिए एक प्रक्रिया है जो आपको एक कार्यक्रम लागू करने की अनुमति देगा जिसमें सरणी आकार तब तक अनिर्दिष्ट है जब तक आप अपना प्रोग्राम (रनटाइम) नहीं चलाते। इस प्रक्रिया को " डायनेमिक मेमोरी आवंटन " कहा जाता है ।

इस ट्यूटोरियल में, आप सीखेंगे-

  • C में मेमोरी मैनेजमेंट कैसे काम करता है?
  • सी में गतिशील मेमोरी आवंटन
  • सी मॉलोक () फ़ंक्शन
  • मुफ्त () समारोह
  • C कॉलोक () फ़ंक्शन
  • कॉलोक () बनाम मॉलोक (): प्रमुख अंतर
  • सी realloc () फ़ंक्शन
  • डायनामिक एरेस

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

डायनेमिक मेमोरी आवंटन आपकी प्रोग्रामिंग जरूरतों के अनुसार मैन्युअल आवंटन और मेमोरी को मुक्त करना है। डायनेमिक मेमोरी को प्रबंधित किया जाता है और पॉइंटर्स के साथ परोसा जाता है जो उस क्षेत्र में नए आवंटित मेमोरी स्पेस को इंगित करता है जिसे हम हीप कहते हैं।

अब आप बिना किसी समस्या के गतिशील रूप से तत्वों की एक सरणी बना और नष्ट कर सकते हैं। योग करने के लिए, स्वचालित मेमोरी प्रबंधन स्टैक का उपयोग करता है, और सी डायनेमिक मेमोरी आवंटन ढेर का उपयोग करता है।

लाइब्रेरी में डायनामिक मेमोरी मैनेजमेंट के लिए जिम्मेदार कार्य हैं।

समारोह उद्देश्य
मैलोक () अनुरोधित आकार की मेमोरी आवंटित करता है और आवंटित स्थान के पहले बाइट को पॉइंटर लौटाता है।
कॉलोक () किसी सरणी के तत्वों के लिए स्थान आवंटित करता है। शून्य करने के लिए तत्वों को आरम्भ करता है और मेमोरी को पॉइंटर लौटाता है।
Realloc () इसका उपयोग पहले आवंटित मेमोरी स्पेस के आकार को संशोधित करने के लिए किया जाता है।
नि: शुल्क() पेड़ या पहले से आवंटित मेमोरी स्पेस को खाली कर देता है।

चलो उनके आवेदन के साथ उपरोक्त कार्यों पर चर्चा करें

सी मॉलोक () फ़ंक्शन

सी मॉलोक () फ़ंक्शन मेमोरी आवंटन के लिए है। यह एक फ़ंक्शन है जो गतिशील रूप से मेमोरी के ब्लॉक को आवंटित करने के लिए उपयोग किया जाता है। यह निर्दिष्ट आकार की मेमोरी स्पेस को सुरक्षित रखता है और स्मृति स्थान की ओर इशारा करते हुए अशक्त सूचक देता है। लौटाया गया पॉइंटर प्राय: शून्य प्रकार का होता है। इसका मतलब है कि हम किसी भी पॉइंटर को सी मॉलोक () फ़ंक्शन असाइन कर सकते हैं।

सिंटेक्स ऑफ़ मल्कोक () फ़ंक्शन:

ptr = (cast_type *) malloc (byte_size);

यहाँ,

  • ptr, cast_type का सूचक है।
  • C मॉलॉक () फ़ंक्शन बाइट_साइज़ की आवंटित मेमोरी को पॉइंटर लौटाता है।

Malloc का उदाहरण ():

Example: ptr = (int *) malloc (50)

जब इस कथन को सफलतापूर्वक निष्पादित किया जाता है, तो 50 बाइट्स का मेमोरी स्पेस आरक्षित होता है। आरक्षित स्थान के पहले बाइट का पता टाइप इंट के पॉइंटर ptr को सौंपा गया है।

एक अन्य उदाहरण पर विचार करें:

#include int main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */if (ptr != NULL) {*(ptr + 5) = 480; /* assign 480 to sixth integer */printf("Value of the 6th integer is %d",*(ptr + 5));}}

आउटपुट:

Value of the 6th integer is 480

  1. ध्यान दें कि कोड को और अधिक मजबूत बनाने के लिए आकार (* ptr) का उपयोग sizeof (int) के बजाय किया गया था जब * ptr घोषणा को बाद में एक अलग डेटा प्रकार में टाइप किया जाता है।
  2. यदि मेमोरी पर्याप्त नहीं है तो आवंटन विफल हो सकता है। इस स्थिति में, यह एक NULL पॉइंटर लौटाता है। इसलिए, आपको NULL पॉइंटर के लिए जाँच करने के लिए कोड शामिल करना चाहिए।
  3. ध्यान रखें कि आवंटित स्मृति सन्निहित है और इसे एक सरणी के रूप में माना जा सकता है। हम ब्रैकेट [] का उपयोग करने के बजाय सरणी तत्वों तक पहुंचने के लिए सूचक अंकगणितीय का उपयोग कर सकते हैं। हम सरणी तत्वों को संदर्भित करने के लिए + का उपयोग करने की सलाह देते हैं क्योंकि वृद्धि ++ या + = का उपयोग करके सूचक द्वारा संग्रहीत पते को बदल देता है।

मॉलॉक () फ़ंक्शन का उपयोग चरित्र डेटा प्रकार के साथ-साथ जटिल डेटा प्रकार जैसे संरचनाओं के साथ भी किया जा सकता है।

मुफ्त () समारोह

चर के लिए मेमोरी को संकलन समय पर स्वचालित रूप से निपटाया जाता है। डायनेमिक मेमोरी एलोकेशन में, आपको मेमोरी को स्पष्ट रूप से डील करना होगा। यदि ऐसा नहीं किया जाता है, तो आप मेमोरी एरर से बाहर आ सकते हैं।

फ्री () फंक्शन को C. में मेमोरी को डिलीट / डिले करने के लिए कहा जाता है। अपने प्रोग्राम में मेमोरी को फ्रीज करके, आप बाद में उपयोग के लिए अधिक उपलब्ध करवाते हैं।

उदाहरण के लिए:

#include int main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){*(ptr + 2) = 50;printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}

उत्पादन

 Value of the 2nd integer is 50

C कॉलोक () फ़ंक्शन

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

Malloc () फ़ंक्शन का उपयोग मेमोरी स्पेस के एक ब्लॉक को आवंटित करने के लिए किया जाता है जबकि C में कॉलॉक () का उपयोग मेमोरी स्पेस के कई ब्लॉक को आवंटित करने के लिए किया जाता है। कॉलोक () फ़ंक्शन द्वारा आवंटित प्रत्येक ब्लॉक एक ही आकार का है।

कॉलॉक का सिंटैक्स () फ़ंक्शन:

ptr = (cast_type *) calloc (n, size);
  • उपरोक्त कथन का उपयोग उसी आकार के n मेमोरी ब्लॉक को आवंटित करने के लिए किया जाता है।
  • मेमोरी स्पेस आवंटित होने के बाद, तब सभी बाइट्स को शून्य से आरंभ किया जाता है।
  • पॉइंटर जो वर्तमान में आवंटित मेमोरी स्पेस के पहले बाइट पर है।

जब भी मेमोरी स्पेस आवंटित करने में कोई त्रुटि होती है जैसे कि मेमोरी की कमी, तो एक नल पॉइंटर वापस आ जाता है।

कॉलोक का उदाहरण ():

नीचे कार्यक्रम एक अंकगणितीय अनुक्रम के योग की गणना करता है।

#include int main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \ n ");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}

परिणाम:

Building and calculating the sequence sum of the first 10 termsSum = 45

कॉलोक () बनाम मॉलोक (): प्रमुख अंतर

निम्नलिखित सी में मॉलोक () बनाम कॉलोक () के बीच महत्वपूर्ण अंतर है:

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

C में कॉलकोक () द्वारा आवंटित मेमोरी ब्लॉक को हमेशा शून्य पर आरंभीकृत किया जाता है जबकि C में फ़ंक्शन मॉलोक () में, इसमें हमेशा कचरा मूल्य होता है।

सी realloc () फ़ंक्शन

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

realloc () का उपयोग पहले से आवंटित मेमोरी के आकार को कम करने के लिए भी किया जा सकता है।

Realloc का सिंटैक्स () फ़ंक्शन:

ptr = realloc (ptr,newsize);

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

Realloc का उदाहरण ():

#include int main () {char *ptr;ptr = (char *) malloc(10);strcpy(ptr, "Programming");printf(" %s, Address = %u\n", ptr, ptr);ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;} 

जब भी Realloc () C एक असफल ऑपरेशन में परिणाम देता है, तो यह एक अशक्त सूचक देता है, और पिछला डेटा भी मुक्त हो जाता है।

सी में डायनामिक एरे

सी में एक गतिशील सरणी तत्वों की संख्या को आवश्यकतानुसार बढ़ने की अनुमति देता है। कंप्यूटर विज्ञान एल्गोरिदम में सी डायनामिक सरणी का व्यापक रूप से उपयोग किया जाता है।

निम्नलिखित प्रोग्राम में, हमने C में एक डायनामिक एरे को बनाया और उसका आकार बदला है

#include int main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (i = 0; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);elements = 4;arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elementsprintf("After realloc\n");for (i = 2; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);free(arr_dynamic);} 

स्क्रीन पर सी डायनामिक एरे प्रोग्राम का परिणाम:

arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3

सारांश

  • हम स्मृति को ब्लॉक में आवश्यकतानुसार मेमोरी ब्लॉक बनाकर स्मृति का प्रबंधन कर सकते हैं
  • सी डायनेमिक मेमोरी आवंटन में, मेमोरी को एक रन टाइम पर आवंटित किया जाता है।
  • डायनामिक मेमोरी आवंटन स्ट्रिंग्स और सरणियों में हेरफेर करने की अनुमति देता है जिसका आकार लचीला है और इसे आपके प्रोग्राम में कभी भी बदला जा सकता है।
  • यह आवश्यक है जब आपको पता न हो कि एक विशेष संरचना कितनी मेमोरी पर कब्जा करने जा रही है।
  • Malloc () C में एक डायनेमिक मेमोरी एलोकेशन फंक्शन है, जो मेमोरी एलोकेशन के लिए है, जो कि गारबेज वैल्यू में इनिशियल साइज़ के साथ मेमोरी के ब्लॉक्स को ब्लॉक करता है।
  • C में Calloc () एक सन्निहित स्मृति आबंटन फ़ंक्शन है जो 0 से आरंभिक समय में कई मेमोरी ब्लॉक आवंटित करता है
  • सी में Realloc () का उपयोग निर्दिष्ट आकार के अनुसार मेमोरी को पुनः लोड करने के लिए किया जाता है।
  • फ्री () फ़ंक्शन का उपयोग गतिशील रूप से आवंटित मेमोरी को साफ़ करने के लिए किया जाता है।