Память может или не может все еще содержать 4, когда она попадает в вашу строку cout.Это может содержать 4 строго случайно.:)
Перво-наперво: ваша операционная система может обнаруживать, что доступ к памяти сбился только с границ страницы .Итак, если у вас 4к или 8к или 16к или больше.(Проверьте /proc/self/maps
в системе Linux однажды, чтобы увидеть структуру памяти процесса; любые адреса в перечисленных диапазонах разрешены, любые вне указанных диапазонов недопустимы. Каждая современная ОС на CPU с защищенной памятью будет поддерживатьаналогичный механизм, поэтому он будет поучителен, даже если вы просто не заинтересованы в Linux. Я просто знаю, что это легко для Linux.) Итак, ОС не может помочь вам, когда ваши данные настолько малы.
Кроме того, ваш int inf = 4;
вполне может быть сохранен в сегментах .rodata
, .data
или .text
вашей программы.Статические переменные могут быть вставлены в любой из этих разделов (я понятия не имею, как решает компилятор / компоновщик; я считаю это волшебством), и поэтому они будут действительны в течение всей продолжительности программы.Проверьте size /bin/sh
в следующий раз, когда вы находитесь в системе Unix, чтобы понять, сколько данных попадает в какие разделы.(И проверьте readelf(1)
слишком много информации. objdump(1)
, если вы используете более старые системы.)
Если вы измените inf = 4
на inf = i
, то хранилище будет выделено настек, и у вас гораздо больше шансов быстро его перезаписать.