¿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
?