Я играл с небезопасным кодом для проблемы на 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.