एक गैर-कॉन्स्ट पॉइंटर के माध्यम से एक स्थिरांक को संशोधित करना: अपरिभाषित व्यवहार में तल्लीन करना
प्रदान किए गए कोड स्निपेट में, आप व्यवहार पर भ्रम व्यक्त करते हैं एक गैर-कॉन्स्ट सूचक के माध्यम से एक स्थिर पूर्णांक (e) को संशोधित करना (w):
const int e = 2;
int* w = (int*) &e; // Casting to remove const-ness
*w = 5; // Modifying the value pointed to by w
द्वारा इंगित मान को संशोधित करना यह संशोधन करने के बाद, आप देखते हैं कि:
आप आगे ध्यान दें कि पता w e के पते के समान है (cout cout w के माध्यम से किए गए संशोधन के बावजूद e कैसे अपरिवर्तित रहता है।
यह व्यवहार उस अपरिभाषित व्यवहार से उत्पन्न होता है जो एक गैर के माध्यम से एक स्थिरांक को संशोधित करते समय उत्पन्न होता है - स्थिरांक सूचक. एक बार जब आप ऐसा संशोधन करते हैं, तो कोड अपरिभाषित व्यवहार क्षेत्र में प्रवेश करता है, जहां यह अप्रत्याशित हो जाता है और विशिष्ट कार्यान्वयन विवरणों पर निर्भर करता है।
इस मामले में, ऐसा प्रतीत होता है कि w के माध्यम से संशोधन एक को प्रभावित करता है रनटाइम पर e की अस्थायी प्रतिलिपि, जबकि मूल e अपरिवर्तित रहती है। इसका कारण यह है कि e को संकलन-समय स्थिरांक के रूप में माना जाता है, और इसका मान बाइनरी कोड में हार्डकोड किया जाता है। इसलिए, w में कोई भी रनटाइम संशोधन मूल e को प्रभावित नहीं करेगा।
यह व्यवहार उपयोग किए गए कार्यान्वयन के लिए विशिष्ट है और इस पर भरोसा नहीं किया जाना चाहिए। नॉन-कॉन्स्ट पॉइंटर्स के माध्यम से निरंतर डेटा को संशोधित करना एक बुरा अभ्यास माना जाता है और इससे बचा जाना चाहिए। सही दृष्टिकोण एक गैर-कॉन्स्ट संदर्भ का उपयोग करना या उस डेटा की एक गैर-कॉन्स्ट कॉपी बनाना है जिसे आप संशोधित करना चाहते हैं।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3