Столкнулся с проблемой.
Почему строковый массив может переполняться без какой-либо ошибки?
При объявлении, например, char c[10], я могу дать значение c[12] и вывести его. Почему так происходит?
Потому что это идеология такая у Си.
Си - это как бы ассемблер, но чуть поудобнее. И все на ответственность программиста.
Дополнительные проверки можно включить в настройках компилятора. Но это заметно влияет на производительность. Впрочем, для очень многих задач - разница не критична.
Как вариант - используйте "статические анализаторы".
Они проверяют код на подозрительные места не во время исполнения, поэтому можно и скорость максимизировать и ошибок избежать.