¿Por qué no * (int *) 0 = 0 causa una infracción de acceso?

Con fines educativos, estoy escribiendo un conjunto de métodos que causan excepciones de tiempo de ejecución en C # para comprender cuáles son todas las excepciones y qué las causa. En este momento, estoy jugando con programas que causan unAccessViolationException.

La forma más obvia (para mí) de hacer esto era escribir en una ubicación de memoria protegida, como esta:

System.Runtime.InteropServices.Marshal.WriteInt32(IntPtr.Zero, 0);

usto como esperaba, esto arrojó unAccessViolationException. Quería hacerlo de manera más concisa, así que decidí escribir un programa con código inseguro y hacer (lo que pensé que era) exactamente lo mismo asignando0 al puntero cero.

unsafe
{
    *(int*)0 = 0;
}

Por razones que me eluden, esto arroja unNullReferenceException. Jugué un poco y descubrí que usando*(int*)1 en su lugar también arroja unNullReferenceException, pero si usa un número negativo, como*(int*)-1 arrojará unAccessViolationException.

¿Que está pasando aqui? Por que*(int*)0 = 0 porque unNullReferenceException, y por qué no causa unAccessViolationException?

Respuestas a la pregunta(10)

Su respuesta a la pregunta