Я играл с небезопасным кодом для проблемы с Code Golf,, и я нашел то, что не могу объяснить. Этот код:
unsafe
{
int i = *(int*)0;
}
Сбой с нарушением доступа (Segfault), но этот код:
unsafe
{
*(int*)0=0;
}
Выбрасывает исключение NullReferenceException. Мне кажется, что первый выполняет чтение, а второй выполняет запись. Исключение говорит мне, что что-то, где-то в CLR перехватывает запись и останавливает ее до того, как ОС уничтожит этот процесс. Почему это происходит при записи, но не на чтение? Это делает segfault для записи, если я делаю значение указателя достаточно большим. Означает ли это, что есть блок памяти, который знает CLR, и не будет даже пытаться писать? Почему же это позволяет мне попытаться прочитать из этого блока? Я что-то совершенно не понимаю?
Edit:
Интересно: System.Runtime.InteropServices.Marshal.WriteInt32(IntPtr.Zero, 0);
Дает мне нарушение доступа, а не NullReference.