2011-01-30 8 views
7

संभव डुप्लिकेट:
Does the evil cast get trumped by the evil compiler?यदि मैं इसे सी में पॉइंटर के माध्यम से संशोधित कर सकता हूं तो कॉन्स्ट क्वालीफायर का उद्देश्य क्या है?

हैलो,

मैं एक सूचक के माध्यम से एक निरंतर संशोधित कर सकते हैं, तो यह करने के उद्देश्य क्या है?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
const int a = 10; 
int *p = (int *)&a; 

printf("Before: %d \n", a); 
*p = 2; 
/*a = 2; gives error*/ 

printf("After: %d \n", *p); 

return 0; 
} 

आउटपुट:

से पहले: 10
के बाद: 2
कोई भी कुंजी दबाएं जारी रखने के लिए नीचे कोड है। । ।

विजुअल स्टूडियो 2008

+3

सी [बुराई डाली बुराई संकलक द्वारा मात हो रहा है?] (Http://stackoverflow.com/questions/712334/does-the-evil-cast-get-trumped-by-the-evil- संकलक)। यह [अपरिभाषित व्यवहार] है (http://www.catb.org/jargon/html/N/nasal-demons.html)। – ephemient

+0

अब अनुकूलन के साथ संकलित करें। – GManNickG

उत्तर

12

कारण आप मूल्य को संशोधित कर सकता है, क्योंकि आप एक सूचक समान किरदार कि const सत्ता से दूर छीन किया का उपयोग करना:

int *p = (int *)&a; 

यह एक const int* (अर्थात् &a typecasts) int * पर, जिससे आप चर को आसानी से संशोधित कर सकते हैं। आम तौर पर संकलक आपको इसके बारे में चेतावनी देगा, लेकिन स्पष्ट टाइपकास्ट ने चेतावनी को दबा दिया।

const के पीछे मुख्य तर्क आपको गलती से उस चीज़ को संशोधित करने से रोकने के लिए है जिसे आपने वादा नहीं किया था। जैसा कि आपने देखा है, यह पवित्र नहीं है, और आप const नेस को निर्दोषता से दूर कर सकते हैं, वैसे ही आप अन्य असुरक्षित चीजें जैसे पॉइंटर्स को पूर्णांक या इसके विपरीत में परिवर्तित कर सकते हैं। विचार यह है कि आपको const के साथ गड़बड़ न करने का सबसे अच्छा प्रयास करना चाहिए, और यदि आप ऐसा करते हैं तो संकलक आपको चेतावनी देगा। बेशक, एक कलाकार में जोड़ना संकलक को बताता है "मैं जानता हूं कि मैं क्या कर रहा हूं," और इसलिए आपके मामले में उपरोक्त किसी भी तरह की चेतावनियां उत्पन्न नहीं करता है।

9

मैं एक सूचक के माध्यम से एक निरंतर संशोधित कर सकते हैं तो यह करने के उद्देश्य क्या है? नीचे दिए गए कोड है:

यह वह जगह है अपरिभाषित व्यवहार और हर हालत में बचा जाना चाहिए:

§ C99 6.7.3p5

एक प्रयास एक वस्तु को संशोधित करने के किया जाता है गैर-कॉन्स्ट-क्वालिफाइड प्रकार, व्यवहार के साथ एक लैंड्यू के उपयोग के माध्यम से एक कॉन्स्टेक्टेड के साथ परिभाषित किया गया है अपरिभाषित है।

+1

"हर कीमत से बचा जाना चाहिए" लेकिन क्या होगा यदि किसी व्यक्ति ने कहा कि अगर मैं नहीं करता तो वे मुझे चोट पहुंचाएंगे? :( – GManNickG

+6

@GMan यूबी को रोकने के लिए स्वयं को बलिदान देना निर्वाण कोडिंग में एक स्थान की गारंटी देता है जहां 'स्थिर' कीवर्ड का केवल एक अर्थ होता है और पर्ल 6 की रिलीज तिथि ज्ञात होती है। – SiegeX

+0

आपका मतलब है कि वे कोडिंग निर्वाण में गैर-लिस्प भाषाओं के साथ परेशान हैं ? –

संबंधित मुद्दे

 संबंधित मुद्दे