सी में फ़ंक्शंस से एरेज़ लौटाना
सी में फ़ंक्शंस से एरेज़ वापस करने का प्रयास अप्रत्याशित व्यवहार का कारण बन सकता है, जैसा कि निम्नलिखित कोड द्वारा दर्शाया गया है स्निपेट:
int* uni(int *a,int *b)
{
int c[10];
...
return c;
}
यह फ़ंक्शन फ़ंक्शन से एक स्थानीय सरणी c वापस करने का प्रयास करता है। हालाँकि, जब फ़ंक्शन वापस आता है, तो सरणी द्वारा कब्जा की गई मेमोरी को हटा दिया जाता है, जिसके परिणामस्वरूप जब कॉलर इसे एक्सेस करने का प्रयास करता है तो अपरिभाषित व्यवहार होता है।
अंतर्निहित समस्या स्टैक पर सरणी संग्रहीत करने के तरीके में निहित है। जब किसी फ़ंक्शन के भीतर एक सरणी घोषित की जाती है, तो इसे स्टैक पर आवंटित किया जाता है, स्थानीय चर और फ़ंक्शन कॉल के लिए उपयोग किया जाने वाला एक मेमोरी क्षेत्र। जब फ़ंक्शन बाहर निकलता है, तो स्टैक पर मेमोरी हटा दी जाती है, जिसमें सरणी की मेमोरी भी शामिल होती है।
इस समस्या को हल करने के लिए, कई विकल्प मौजूद हैं:
पासिंग पॉइंटर्स:
एक दृष्टिकोण मुख्य फ़ंक्शन से सरणियों में पॉइंटर्स को पास करना है:
int* uni(int *a,int *b)
{
...
return a;
}
यह दृष्टिकोण मुख्य फ़ंक्शन को सीधे सरणी तक पहुंचने और हेरफेर करने की अनुमति देता है। हालाँकि, विभाजन दोषों से बचने के लिए सावधानीपूर्वक मेमोरी प्रबंधन की आवश्यकता होती है। या std::array. ये कंटेनर स्वचालित रूप से मेमोरी प्रबंधन को संभालते हैं, जिससे मैन्युअल पॉइंटर हेरफेर की आवश्यकता समाप्त हो जाती है। संरचना उदाहरण:
struct myArray { पूर्णांक सरणी[10]; }; myArray uni(int *a,int *b) { ... वापसी सी; }
एक मान (संरचना उदाहरण) लौटाकर, सरणी की सामग्री को मुख्य फ़ंक्शन के दायरे में कॉपी किया जाता है, जिससे उनकी पहुंच सुनिश्चित होती है।अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3