सी में नल पॉइंटर्स के माध्यम से कॉलिंग विधियों का अप्रत्याशित व्यवहार
प्रदान किए गए कोड स्निपेट में, एक विधि को एक शून्य पॉइंटर के माध्यम से लागू किया जाता है, लेकिन आश्चर्यजनक रूप से, विधि कॉल बिना क्रैश हुए निष्पादित होती प्रतीत होती है। यह असामान्य व्यवहार सवाल उठाता है: क्या सी मानक में इसकी अनुमति है या यह केवल कार्यान्वयन अनुकूलन है?
स्पष्टीकरण सी में विधि कॉल की प्रकृति में निहित है। जब किसी ऑब्जेक्ट की विधि लागू की जाती है, तो कंपाइलर ऑब्जेक्ट के प्रकार को जानता है, और इसलिए निष्पादित की जाने वाली विधि का पता जानता है। इस मामले में, पॉइंटर का प्रकार ज्ञात है (भले ही इसका मान शून्य हो), इसलिए कंपाइलर अभी भी विधि का पता निर्धारित कर सकता है।
महत्वपूर्ण बात यह है कि जिस विधि को (शो) कहा जा रहा है वह ऑब्जेक्ट तक नहीं पहुंच पाता राज्य (इस सूचक द्वारा दर्शाया गया)। नतीजतन, विधि का निष्पादन अपेक्षित रूप से आगे बढ़ता है, भले ही जिस वस्तु पर यह संचालित होता है वह अप्रारंभित हो।
हालांकि यह व्यवहार अप्रत्याशित लग सकता है, यह मानक-अनुपालक नहीं है। सी मानक स्पष्ट रूप से बताता है कि किसी सदस्य को शून्य सूचक के माध्यम से एक्सेस करने से अपरिभाषित व्यवहार होता है। हालाँकि, कुछ कंपाइलर नल पॉइंटर चेक को छोड़कर और सीधे विधि को लागू करके ऐसी कॉल को अनुकूलित कर सकते हैं।
यह अनुकूलन दक्षता के लिए सुरक्षा का व्यापार करता है, क्योंकि यह विधि कॉल को निष्पादित करने की अनुमति देता है, भले ही उनका इरादा न हो। हालांकि यह निष्पादन के दौरान कुछ समय बचा सकता है, यह सूक्ष्म बग और अपरिभाषित व्यवहार की संभावना का परिचय देता है।
इसलिए, सही और पूर्वानुमानित प्रोग्राम व्यवहार सुनिश्चित करने के लिए ऑब्जेक्ट सदस्यों तक पहुंचने से पहले हमेशा शून्य पॉइंटर्स की जांच करने की अनुशंसा की जाती है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3