Почему * (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?

Ответы на вопрос(5)

Ваш ответ на вопрос