La memoria puede contener o no un 4 cuando llega a su línea de cout. Puede contener un 4 estrictamente por accidente. :)
Lo primero es lo primero: el sistema operativo solo puede detectar el acceso a la memoria extraviado en límites de página. Por lo tanto, si tiene 4k, 8k o 16k o más. (Verifique el /proc/self/maps
en un sistema Linux algún día para ver el diseño de la memoria de un proceso; se permiten las direcciones en los rangos listados, no se permiten las que estén fuera de los rangos listados. Todos los sistemas operativos modernos en CPU con memoria protegida soportarán un mecanismo similar , así que será instructivo incluso si no estás interesado en Linux. Solo sé que es fácil en Linux.) Por lo tanto, el sistema operativo no puede ayudarte cuando tus datos son tan pequeños.
Además, su int inf = 4;
podría muy bien ser escondido en las .rodata
, .data
o .text
segmentos de su programa. Las variables estáticas pueden incluirse en cualquiera de estas secciones (no tengo idea de cómo lo decide el compilador/vinculador, lo considero mágico) y, por lo tanto, serán válidas durante toda la duración del programa. Comprueba size /bin/sh
la próxima vez que estés en un sistema Unix para obtener una idea de la cantidad de datos que se colocan en cada sección. (Y echa un vistazo readelf(1)
de demasiada información. objdump(1)
si se encuentra en los sistemas más antiguos.)
Si cambia inf = 4
a inf = i
, a continuación, el almacenamiento será asignado en la pila, y que tienen una mejor oportunidad de haciendo que se sobrescriba rápidamente.
No hay un objeto estáticamente asignado en su código. –
... con la excepción de cout, por supuesto :-) –