2013-06-20 4 views
5

मान लीजिए कि मैं एक चर x घोषित करता हूं और इसे अनियंत्रित छोड़ देता हूं। मैं इसके मूल्य को मुद्रित करने के लिए आगे बढ़ता हूं। मैं कुछ जंक देखता हूँ।एक अनियमित चर को यादृच्छिक मान कैसे मिलता है?

यह कहां से आता है? इसके अलावा यादृच्छिक संख्या उत्पन्न करने के लिए इसका उपयोग क्यों नहीं किया जाता है? मेरा मतलब है छद्म यादृच्छिक जनरेटर का उपयोग करने के बजाय।

+2

http://research.swtch.com/openssl –

+0

बस इसे आज़माएं, अपने प्रोग्राम को वेरिएबल वैल्यू प्रिंट करने के कई बार लॉन्च करें: आप देखेंगे कि यह यादृच्छिक मान – Antonio

+0

के रूप में उपयोग करने योग्य नहीं है। और यह मुझे हर बार एक ही मूल्य दे रहा है। सी मेमोरी डीलोकेशन कैसे काम करता है? –

उत्तर

7

'यादृच्छिक' मान बस उस स्थान पर स्मृति में क्या छोड़ा गया है। जब इसे मुक्त किया जाता है तो मेमोरी आमतौर पर मिट नहीं जाती/शून्य नहीं होती है, इसलिए जो कुछ भी था, वह तब तक समाप्त हो जाएगा जब तक यह अधिलेखित नहीं हो जाता।

+1

देखें [ऊपर मेरी टिप्पणी] (http://stackoverflow.com/questions/17216663/ कैसे-एक-अनियमित-परिवर्तनीय-प्राप्त-एक-यादृच्छिक-मूल्य # टिप्पणी51503431_17216663) ... आपको ध्यान रखना चाहिए कि यह अनिर्धारित व्यवहार है। –

1

कबाड़ दो स्थानों से आ सकती है:

  • जब गतिशील रैम ऊपर संचालित है, कोशिकाओं मनमाने ढंग से राज्य में रहते हैं जब तक प्रारंभ; यह स्मृति
  • के अधिकांश हार्डवेयर कार्यान्वयन की एक संपत्ति है जब आपका प्रोग्राम चलता है, तो यह उन चर के मानों के पीछे छोड़ देता है जिनका उपयोग पहले किया गया था लेकिन अब दायरे में नहीं हैं। इस संपत्ति का उपयोग हमलों के लिए किया जा सकता है: आपके प्रोग्राम द्वारा छोड़े गए जंक का विश्लेषण करने से आप प्लग इन या अन्य पुस्तकालयों के बेईमान लेखकों को जानकारी दे सकते हैं।
0

एक अनियंत्रित चर का मान संबंधित चर क्षेत्र में मौजूद मान है जो इसे इस चर को सौंपा गया है। अधिकांश समय यह अप्रत्याशित है और इस स्मृति क्षेत्र के भीतर जो भी हुआ उससे निर्भर है।

यह वास्तव में कभी-कभी छद्म-यादृच्छिक संख्या उत्पन्न करने के लिए अतिरिक्त एन्ट्रॉपी के रूप में उपयोग किया जाता है। सालों पहले, एक डेबियन डेवलपर्स ने सोचा था कि ओपनएसएसएल में एक अनियमित वैरिएबल एक बग था और इसे शून्य पर सेट किया गया था। तब जेनरेट की गई चाबियाँ कुछ हद तक अनुमानित हो गईं और अब प्रत्येक डेबियन उपयोगकर्ताओं को अपनी मशीनों पर काले सूचीबद्ध कुंजी की एक लंबी सूची स्थापित करनी होगी।

0

संक्षिप्त उत्तर? यह आपके कंपाइलर पर निर्भर करता है - लेकिन ऐसा मत करो।

विस्तृत उत्तर है:
एक गैर-आरंभिकृत पॉड का मूल्य तक पहुँचना (सादे पुराने डेटा, जैसे 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

दूसरे शब्दों में, जिस क्षण आप उस अनियमित चर का उपयोग करते हैं, आपका प्रोग्राम आपके नियंत्रण के बाहर कुछ भी करना शुरू कर सकता है। ऐसा मत करो - यहां ड्रेगन बनें।

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