Доступ к любой памяти, которой вы не владеете, является неопределенным поведением. Это просто означает, что стандарт C вообще ничего не требует от компилятора, чтобы справиться с ситуацией.
Поскольку C стремится быть эффективным языком, компиляторы редко (когда-либо?) Будут выпускать машинный код, который обеспечиваетпроверки во время выполнения таких вещей. Они могут выдавать или не выдавать предупреждения или ошибки, если нарушение обнаруживается во время компиляции.
Суть этого заключается в следующем: любое сообщение об ошибке, включая segfault, которое вы получаете во время выполнения, обычно исходит изОПЕРАЦИОННЫЕ СИСТЕМЫ. На старых системах / ОС или даже сегодня на небольших (встроенных) системах такого рода управление памятью было / не было доступно, и нарушения доступа к памяти могли просто привести к сбою всей системы, возможно, в течение длительного времени после первоначального нарушения. Или ничего не могло случиться. Или даже более коварные вещи, такие как повреждение данных.
Так что будьте счастливы иметь сеть безопасности современных систем управления виртуальной памятью ОС, но не полагайтесь на них, чтобы предотвратить ошибки программирования, нанести больший ущерб или обнаружитьв первую очередь такие ошибки.
Вам также следует немного поэкспериментировать с такими инструментами, как valgrind, которые предлагают много аналитики времени выполнения и обнаружение ошибок для ваших программ;таким образом можно многому научиться.
Кстати: как заметил Селби в комментарии, ваш код, вероятно, перезаписывает часть стекового фрейма функции или записи активации. Причина этого в том, что стек на большинстве машин растет вниз (новая память выделяется по меньшим адресам), но индексация массива движется вверх. Многие компиляторы включают опцию компиляции с помощью «стека канарейки», который может обнаружить повреждение стека во время выполнения. Это очень полезная функция при разработке и тестировании, а также обеспечивает некоторую защиту от вредоносных программ, которые пытаются использовать именно такие переполнения буфера.