C по своей конструкции не выполняет проверку границ массива. Он был разработан как язык системного уровня, и накладные расходы на явную проверку границ во время выполнения могут быть непомерно высокими во многих случаях. Следовательно, C допускает «опасный» код и должен использоваться осторожно. Если вам нужно что-то «более безопасное», тогда C # или Java могут быть более подходящими, но есть определенный удар по производительности.
Могут помочь инструменты автоматического статического анализа, и есть инструменты проверки границ во время выполнения для использования при разработке и отладке.
В C массив - это непрерывный блок памяти. Получая доступ к массиву за пределами, вы просто получаете доступ к памяти за пределами массива. Доступ к такой памяти будет недетерминированным, он может быть нежелательным, он может принадлежать смежной переменной или может принадлежать переменным вызывающей функции или выше. Это может быть адрес возврата для текущей функции или вызывающей функции. В ОС с защитой памяти, такой как Windows или Linux, если вы заходите настолько далеко за пределы, что больше не находитесь в диапазоне адресов, назначенном процессу, возникнет исключительная ситуация ошибки.