出于教育目的,我正在编写一组方法,使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
)。 - cHao