const वेरिएबल को सीधे संशोधित करना कंपाइल एरर देता है, लेकिन पॉइंटर के माध्यम से अप्रत्यक्ष संशोधन संभव है (हालांकि यह **अनडिफाइंड बिहेवियर** है)।
सीधा संशोधन (एरर)
#include <stdio.h>
int main() {
const int x = 10;
x = 15; // Error: assignment of read-only variable 'x'
return 0;
}
पॉइंटर के माध्यम से (काम कर सकता है लेकिन UB)
#include <stdio.h>
int main() {
const int x = 10;
int *ptr = (int*)&x; // const कास्ट अवे - खतरनाक!
printf("Before: x = %d\n", x);
*ptr = 15;
printf("After: x = %d\n", x); // 15 प्रिंट हो सकता है
return 0;
}
आउटपुट
Before: x = 10 After: x = 15
क्यों यह खतरनाक है
- अनडिफाइंड बिहेवियर: C मानक के अनुसार,
constऑब्जेक्ट को संशोधित करना UB है। - ऑप्टिमाइज़ेशन: कंपाइलर मान सकता है कि
constवेरिएबल नहीं बदलता और ऑप्टिमाइज़ कर सकता है। - रीड-ओनली मेमोरी: ग्लोबल/स्टेटिक
constवेरिएबल्स.rodataसेक्शन में रखे जा सकते हैं - लिखने पर सेगफॉल्ट (हार्डवेयर प्रोटेक्शन)।
उदाहरण जहां यह फेल होता है
const int x = 10; // ग्लोबल - .rodata में जा सकता है
int main() {
int *ptr = (int*)&x;
*ptr = 15; // Segmentation fault संभावित!
return 0;
}
सही विकल्प
- यदि मान बदलना है, तो
constन लगाएं। - C++ में
mutableकीवर्ड (क्लास मेम्बर्स के लिए) उपयोग करें। - कॉन्स्टनेस कास्ट अवे करने के लिए
const_cast(C++) उपयोग करें, लेकिन केवल जब आप **जानते हों** कि ऑब्जेक्ट मूल रूप से नॉन-कॉन्स्ट था।