C मधील malloc आणि Casting समजून घेणे
सी प्रोग्रामिंगमध्ये, डायनॅमिक मेमरी वाटप बहुतेक वेळा `मॅलोक` फंक्शन वापरून व्यवस्थापित केले जाते. पॉइंटरला नियुक्त करताना `malloc` चा परिणाम कास्ट करायचा की नाही हा विकसकांमध्ये एक सामान्य वादविवाद आहे. उदाहरणार्थ, `int *sieve = (int *)malloc(sizeof(* चाळणी) * length);` ऐवजी `int *sieve = malloc(sizeof(* चाळणी) * length);` वापरणे चांगले आहे का?
हा लेख `malloc` परिणामांच्या कास्ट टाळण्यामागील तर्क शोधतो. आम्ही दोन्ही पध्दतींचे परिणाम शोधून काढू आणि एकाला दुसऱ्यापेक्षा प्राधान्य का दिले जाऊ शकते याबद्दल स्पष्टता देऊ. या बारकावे समजून घेतल्याने तुमच्या सी प्रोग्रामिंग पद्धती सुधारण्यास मदत होऊ शकते.
आज्ञा | वर्णन |
---|---|
malloc | मेमरीच्या बाइट्सची निर्दिष्ट संख्या वाटप करते आणि वाटप केलेल्या मेमरीवर पॉइंटर परत करते. |
sizeof | व्हेरिएबल किंवा डेटा प्रकाराच्या बाइट्समध्ये आकार निर्धारित करते. |
fprintf | निर्दिष्ट प्रवाहावर स्वरूपित स्ट्रिंग मुद्रित करते, जसे की stderr. |
perror | शेवटच्या त्रुटीवर आधारित stderr वर वर्णनात्मक त्रुटी संदेश मुद्रित करते. |
EXIT_FAILURE | अयशस्वी प्रोग्राम समाप्ती दर्शवणारा मॅक्रो. |
free | पूर्वी वाटप केलेली मेमरी डिलॉकेट करते. |
सी मधील मॅलोक आणि मेमरी मॅनेजमेंटमध्ये खोलवर जा
पहिल्या स्क्रिप्टमध्ये आपण याचा वापर पाहतो malloc पूर्णांक ॲरेसाठी डायनॅमिकली मेमरी वाटप करण्यासाठी. विधान १ पूर्णांकांच्या 'लांबी' संख्येसाठी मेमरीची विनंती करते. वापरून sizeof(*sieve), आम्ही खात्री करतो की पॉइंटरच्या प्रकाराकडे दुर्लक्ष करून, योग्य प्रमाणात मेमरी वाटप केली गेली आहे. ही पद्धत परिणाम कास्ट करण्याची आवश्यकता टाळते malloc. मेमरी वाटप अयशस्वी झाल्यास, प्रोग्राम वापरतो fprintf(stderr, "Memory allocation failed\n"); मानक त्रुटी प्रवाहावर त्रुटी संदेश मुद्रित करण्यासाठी आणि नंतर शून्य नसलेल्या स्थितीसह बाहेर पडण्यासाठी. वाटप केलेली मेमरी 1 ते 'लांबी' पर्यंत पूर्णांक संग्रहित करण्यासाठी वापरली जाते आणि नंतर वापरून मुक्त होण्यापूर्वी मुद्रित केली जाते ५.
दुसऱ्या स्क्रिप्टमध्ये, आम्ही समान रचना फॉलो करतो परंतु त्याऐवजी दुहेरीच्या ॲरेसाठी मेमरी वाटप करतो. ओळ double *array = malloc(sizeof(*array) * length); दुहेरीच्या 'लांबी' संख्येसाठी मेमरी वाटप करते. वाटप अयशस्वी झाल्यास, द ७ फंक्शन वर्णनात्मक एरर मेसेज मुद्रित करते आणि प्रोग्राम बाहेर पडतो EXIT_FAILURE. वाटप केलेली मेमरी दुहेरी मूल्ये संग्रहित करण्यासाठी वापरली जाते, जी सम संख्यांमध्ये सुरू केली जाते. ही मूल्ये छापली जातात आणि शेवटी, मेमरी वापरून मुक्त केली जाते ९. चे यश तपासण्याचे महत्त्व दोन्ही स्क्रिप्ट दाखवतात malloc आणि योग्य वापर free मेमरी लीक टाळण्यासाठी.
C मधील malloc चा योग्य वापर समजून घेणे
सी प्रोग्रामिंग
#include <stdio.h>
#include <stdlib.h>
int main() {
int length = 10;
int *sieve = malloc(sizeof(*sieve) * length);
if (sieve == ) {
fprintf(stderr, "Memory allocation failed\\n");
return 1;
}
for (int i = 0; i < length; i++) {
sieve[i] = i + 1;
}
for (int i = 0; i < length; i++) {
printf("%d ", sieve[i]);
}
printf("\\n");
free(sieve);
return 0;
}
C मध्ये कास्ट न करता मेमरी वाटप एक्सप्लोर करत आहे
सी प्रोग्रामिंग
१
C मधील मेमरी वाटपाचे बारकावे
C मधील मेमरी वाटपाचा आणखी एक महत्त्वाचा पैलू म्हणजे त्यातील फरक समजून घेणे malloc आणि इतर मेमरी वाटप फंक्शन्स जसे calloc आणि realloc. असताना malloc प्रारंभ न करता मेमरी ब्लॉक वाटप करते, calloc दोन्ही मेमरी ब्लॉकला शून्यावर वाटप आणि आरंभ करते. हे अप्रारंभ न केलेल्या मेमरी वापरण्यापासून उद्भवणारे काही प्रकारचे बग टाळू शकते. उदाहरणार्थ, १७ सर्व घटक शून्य-प्रारंभिक आहेत याची खात्री करते, जे तुम्हाला स्वच्छ स्लेटची आवश्यकता असेल तेव्हा उपयुक्त आहे.
दुसरीकडे, realloc विद्यमान मेमरी ब्लॉकचा आकार बदलण्यासाठी वापरला जातो. तुम्हाला वाटप केलेल्या मेमरी ब्लॉकचा आकार बदलण्याची आवश्यकता असल्यास, realloc नवीन ब्लॉक वाटप करण्यापेक्षा आणि सामग्री कॉपी करण्यापेक्षा अधिक कार्यक्षम पर्याय असू शकतो. उदाहरणार्थ, arr = realloc(arr, new_length * sizeof(*arr)); द्वारे निर्देशित केलेल्या मेमरी ब्लॉकचा आकार समायोजित करते २१ सामावून घेणे new_length घटक. तथापि, ते हाताळणे महत्वाचे आहे realloc काळजीपूर्वक मेमरी गळती टाळण्यासाठी किंवा मूळ मेमरी ब्लॉक गमावल्यास realloc अपयशी
C मधील malloc बद्दल सामान्य प्रश्न आणि उत्तरे
- काय malloc साठी उभे?
- malloc "मेमरी ऍलोकेशन" चा अर्थ आहे.
- चा निकाल का तपासावा malloc?
- आम्ही निकाल तपासतो malloc मेमरी वाटप यशस्वी झाले याची खात्री करण्यासाठी आणि शून्य पॉइंटरचा संदर्भ घेणे टाळा.
- तर काय होईल malloc अयशस्वी
- तर malloc अयशस्वी झाल्यास, ते शून्य पॉइंटर देते, जे अपरिभाषित वर्तन टाळण्यासाठी तपासले पाहिजे.
- करू शकतो malloc पुरेशी मेमरी उपलब्ध असली तरीही शून्य पॉइंटर परत करा?
- होय, विखंडन सारखे इतर घटक कारणीभूत ठरू शकतात malloc अयशस्वी होणे.
- यात काय फरक आहे malloc आणि calloc?
- malloc सुरू न केलेली मेमरी वाटप करते, तर calloc मेमरी शून्यावर वाटप करते आणि आरंभ करते.
- कसे realloc काम?
- realloc विद्यमान मेमरी ब्लॉकचा आकार बदलतो, नवीन आकार किंवा मूळ आकार यापैकी जे लहान असेल ते सामग्री जतन करून.
- द्वारे वाटप मेमरी मुक्त करणे आवश्यक आहे malloc?
- होय, मेमरी मुक्त करण्यात अयशस्वी झाल्यामुळे मेमरी लीक होते, जी कालांतराने सिस्टम मेमरी संपुष्टात आणू शकते.
malloc कास्टिंग वरील मुख्य टेकवे:
शेवटी, परिणाम निर्णायक malloc C मध्ये आवश्यक नाही आणि कमी वाचनीय कोड आणि संभाव्य त्रुटी होऊ शकतात. कास्ट वगळून, आम्ही C मानकांचे पालन करतो आणि C++ कंपाइलर्ससह सुसंगतता राखतो. चे परिणाम नेहमी तपासा malloc यशस्वी मेमरी वाटप सुनिश्चित करण्यासाठी, आणि गळती टाळण्यासाठी वाटप केलेली मेमरी मोकळी करण्याचे लक्षात ठेवा. या पद्धती अधिक मजबूत आणि देखभाल करण्यायोग्य C कोडमध्ये योगदान देतात, एकूण कार्यक्रम स्थिरता वाढवतात.