संक्षिप्त उत्तर? यह आपके कंपाइलर पर निर्भर करता है - लेकिन ऐसा मत करो।
विस्तृत उत्तर है:
एक गैर-आरंभिकृत पॉड का मूल्य तक पहुँचना (सादे पुराने डेटा, जैसे int
) प्रकार का आह्वान अपरिभाषित व्यवहार, जो सी मानक में एक अनुरूप कार्यान्वयन पर किसी भी आवश्यकताओं जगह नहीं है इसका मतलब है यह स्थिति। इस प्रकार, एक संकलक को मशीन कोड को उत्सर्जित करने की अनुमति है जो nethack
लॉन्च करता है, आपके हार्ड ड्राइव को प्रारूपित करता है, या सी मानक के अनुरूप होने पर कुछ भी नहीं करता है - जब तक यह साबित हो सकता है कि आपके प्रोग्राम में अपरिभाषित व्यवहार कहीं भी होता है।
(इसके अलावा पढ़ें: What Every C Programmer Should Know About Undefined Behavior)
तो, क्या वास्तव में (शायद) होता है?
अधिकांश आधुनिक कंपाइलर्स पर ऑप्टिमाइज़ेशन सक्षम किए बिना, कंपाइलर बस चरम पर स्टैक (या एक रजिस्टर) पर एक स्लॉट असाइन करेगा, फिर पूछे जाने से पहले उस स्थान पर जो कुछ भी था उसे एक्सेस करें। नतीजा यह है कि "यादृच्छिक स्मृति" प्रतीत होता है, हालांकि वास्तविकता it's not very random at all में।
यदि मैं अनुकूलन सक्षम करता हूं तो क्या हो सकता है?
यदि आप अपने कोड को उच्च अनुकूलन स्तर पर संकलित करने के लिए जाते हैं (या संकलक अद्यतन किया गया है और अब अधिक आक्रामक रूप से अनुकूलित करता है), तो सभी दांव बंद हैं।उदाहरण के लिए, संकलक x
को शामिल करने वाली किसी भी कॉल को हटा सकता है, x
को किसी अन्य स्थान के समान स्थान पर असाइन करें (बहस कर रहा है कि x
संभवतः उपयोग नहीं किया जा सकता है, क्योंकि इसे अभी तक प्रारंभ नहीं किया गया है), या any other combination of strange effects।
दूसरे शब्दों में, जिस क्षण आप उस अनियमित चर का उपयोग करते हैं, आपका प्रोग्राम आपके नियंत्रण के बाहर कुछ भी करना शुरू कर सकता है। ऐसा मत करो - यहां ड्रेगन बनें।
http://research.swtch.com/openssl –
बस इसे आज़माएं, अपने प्रोग्राम को वेरिएबल वैल्यू प्रिंट करने के कई बार लॉन्च करें: आप देखेंगे कि यह यादृच्छिक मान – Antonio
के रूप में उपयोग करने योग्य नहीं है। और यह मुझे हर बार एक ही मूल्य दे रहा है। सी मेमोरी डीलोकेशन कैसे काम करता है? –