Почему * (int *) 0 = 0 не вызывает нарушения прав доступа?
В образовательных целях я пишу набор методов, которые вызывают исключения во время выполнения в 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
?