शैक्षणिक उद्देश्यों के लिए, मैं विधियों का एक सेट लिख रहा हूं जो सी # में रनटाइम अपवादों को समझने के लिए कारण हैं कि सभी अपवाद क्या हैं और उन्हें क्या कारण है। अभी, मैं उन कार्यक्रमों के साथ झुका रहा हूं जो AccessViolationException
का कारण बनते हैं।* (int *) 0 = 0 क्यों पहुंच उल्लंघन का कारण नहीं है?
(मेरे लिए) सबसे स्पष्ट तरीका यह है, एक संरक्षित स्मृति स्थान के लिए लिखने के लिए इस तरह था:
System.Runtime.InteropServices.Marshal.WriteInt32(IntPtr.Zero, 0);
बस के रूप में मैं आशा व्यक्त की थी, यह एक AccessViolationException
फेंक दिया। मैं इसे अधिक संक्षेप में करना चाहता था, इसलिए मैंने असुरक्षित कोड के साथ एक प्रोग्राम लिखने का फैसला किया, और शून्य-सूचक में 0
असाइन करके वही काम किया (जो मैंने सोचा था)।
unsafe
{
*(int*)0 = 0;
}
कारणों के कारण मुझे यह NullReferenceException
फेंकता है। मैंने इसके साथ कुछ खेला और पाया कि *(int*)1
का उपयोग करके NullReferenceException
भी फेंकता है, लेकिन यदि आप नकारात्मक संख्या का उपयोग करते हैं, जैसे *(int*)-1
यह AccessViolationException
फेंक देगा।
यहां क्या हो रहा है? *(int*)0 = 0
का कारण NullReferenceException
क्यों है, और इसका कारण AccessViolationException
क्यों नहीं है?
'(int *) 0' एक शून्य सूचक है। मैं पूरी तरह से 'NullReferenceException' की अपेक्षा करता हूं। यदि आप 'AccessViolationException' चाहते हैं, तो' (int *) 0x10' (या संभवतः '0xf0000000') जैसी कुछ कोशिश करें। – cHao
संभावित डुप्लिकेट [सबसे कम पता स्थान में स्मृति पहुंच क्यों है (गैर-शून्य हालांकि) .NET द्वारा NullReferenceException के रूप में रिपोर्ट की गई है?] (Http://stackoverflow.com/questions/7940492/why-is-memory-access-in -टेस्ट-एड्रेस-स्पेस-गैर-नल-यद्यपि-रिपोर्ट-ए-एन) –