Oh mi, bueno.
Técnicamente, sí, puedes. En los dispositivos integrados que no usan una MMU ni ninguna forma de protección (o, ya sabes, x86 en modo real), puede hacer exactamente lo que ha publicado allí. También puede hacerlo en modo de usuario en cualquier sistema operativo, pero las posibilidades de que llegue a la memoria válida son muy pequeñas.
En realidad, no, no puedes hacer eso. Dada la memoria virtual y la protección de memoria, es muy probable que la región a la que intenta acceder no se haya mapeado y, por lo tanto, fallará. Además, si accedes a la memoria protegida (por ejemplo, cualquier cosa que pertenezca al sistema operativo), tu acceso fallará. Ambos escenarios son los que causan fallas de segmentación.
Su resumen es válido (para diversas definiciones de válido), y el programa intentará acceder a la memoria solicitada. Es solo que en realidad podría no asignarse a nada.
También vale la pena señalar que así es como funciona la asignación de memoria de E/S. Digamos que tengo un registro de control de hardware que, cuando se escribe, escribe un byte sobre la línea serial/UART adjunta (y, por simplicidad, funciona como magia y no necesita ningún otro registro para establecer). En C, esto se escribiría de la siguiente manera para mi dispositivo excesivamente simplificada:
#define UART1_OUT 0xFC56
volatile char* uart = UART1_OUT; // Definition of pointer to variable.
// volatile is required here. Look it up, but
// it basically stops your compiler optimising
// anything to do with this variable
*uart = 'A'; // Write an A character to the serial line
Por supuesto, los dispositivos del mundo real son un poco más compleja;).
Puede encontrar información interesante en otra pregunta sobre el desbordamiento de la pila: http://superuser.com/questions/189876/how-os-detects-memory-access-violations – fycth
Wow, gracias por todas las excelentes respuestas. Recuerdo que traté de aprender C en la escuela secundaria (hace más de 10 años, supongo) y me parece recordar que, en el momento en que estaba incursionando, generalmente había un espacio en la memoria y podían ocurrir problemas dentro de él. Es bueno ver que ahora hay más protección para los noobs de bajo nivel como yo. –
Nota al margen, '% s' es la cadena de formato incorrecta para un solo carácter, necesita'% c';) – slugonamission