"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > नॉन-कॉन्स्ट पॉइंटर के माध्यम से `कॉन्स्ट` वेरिएबल को संशोधित करना काम क्यों करता है, लेकिन वास्तव में इसका मूल्य नहीं बदलता है?

नॉन-कॉन्स्ट पॉइंटर के माध्यम से `कॉन्स्ट` वेरिएबल को संशोधित करना काम क्यों करता है, लेकिन वास्तव में इसका मूल्य नहीं बदलता है?

2024-11-07 को प्रकाशित
ब्राउज़ करें:400

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn\'t Actually Change Its Value?

एक गैर-कॉन्स्ट पॉइंटर के माध्यम से एक कॉन्स्ट को संशोधित करना

सी में, एक कॉन्स्ट वेरिएबल को एक बार आरंभ करने के बाद संशोधित नहीं किया जा सकता है। हालाँकि, कुछ परिदृश्यों में, ऐसा प्रतीत हो सकता है कि एक स्थिरांक चर बदल दिया गया है। निम्नलिखित कोड पर विचार करें:

const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout 

यदि आप यह कोड चलाते हैं, तो आपको एक अप्रत्याशित व्यवहार दिखाई देगा:

5
2

हालाँकि *w को (2) में 5 में बदल दिया गया था, e अभी भी 2 का अपना मूल मान रखता है। यह प्रतीत होता है कि विरोधाभासी व्यवहार निम्नलिखित कारकों से उत्पन्न होता है:

  • (1 ) एक कॉन्स्ट पॉइंटर (w) को डीरेफ़रेंस करने से संशोधन की अनुमति मिलती है।
  • (2) संशोधित मान को w द्वारा इंगित मेमोरी स्थान में संग्रहीत किया जाता है, जो इस मामले में मेमोरी स्थान है जहां e संग्रहीत है।
  • हालाँकि, कंपाइलर कोड को अनुकूलित करता है, ई को कंपाइल-टाइम स्थिरांक के रूप में मानता है और रनटाइम पर इसका मूल्यांकन नहीं करता है।

परिणामस्वरूप, जब रनटाइम पर *w का मूल्यांकन किया जाता है, तो यह वापस आ जाता है संशोधित मान (5). हालाँकि, जब संकलन समय पर e का मूल्यांकन किया जाता है, तो इसका मूल मान (2) उपयोग किया जाता है।

इस व्यवहार को C में अपरिभाषित व्यवहार के रूप में जाना जाता है। किसी कॉन्स्ट वेरिएबल को प्रत्यक्ष या अप्रत्यक्ष रूप से संशोधित करने से अप्रत्याशित परिणाम होते हैं, और ऐसी स्थितियों में सावधानी बरती जानी चाहिए।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3