【发布时间】:2012-01-30 15:39:27
【问题描述】:
出于教育目的,我正在编写一组在 C# 中导致运行时异常的方法,以了解所有异常是什么以及导致它们的原因。现在,我正在修改导致AccessViolationException 的程序。
(对我而言)最明显的方法是写入受保护的内存位置,如下所示:
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)。
标签: c# pointers access-violation unsafe