Чего вам не хватает, так это того, что компилятор не обязан отлавливать этот случай и часто этого не делает. Это неопределенное поведение, что означает, что нет никаких требований относительно того, что делает реализация, и ваша задача - избежать этого. Как правило, компилятор просто компилирует все, что видит, в случае неопределенного поведения, и иногда получающееся разумное поведение может сбивать с толку.
В этом случае вы сохранили адрес памяти в numeros
, а в следующем операторе ссылка *(numeros + 900)
, которая при обычном размере int
будет 3600 байт после адреса памяти. Компилятор сгенерировал код для ссылки. Учитывая, что это неопределенное поведение, компилятор был совершенно прав, чтобы написать обидное письмо вам или вашей матери; Стандарт ничего не указывает. Конечно, он может обнаружить это и выдать ошибку во время выполнения, в которой говорится «Адрес за пределами строки в строке 7», но, к сожалению, ни один из используемых мной компиляторов не дает такой возможности.
Это одна из самых хитрых частей программирования на С: убедиться, что ваша программа четко определена.