C ++ не выполняет проверку границ при доступе к массиву, и память не просто останавливается в конце массива. Вы записываете данные в память, которая не является частью массива, последствия которой являются недетерминированными, и иногда даже может показаться работающим.
Вполне вероятно, что если вы поместите этот код в функцию, программа потерпит крах, когда вы попытаетесь вернуться из функции, поскольку одна из вероятных причин состоит в том, что вы сбросили адрес возврата функции в стеке. Возможно, у вас также есть поврежденные данные, относящиеся к вызывающей функции.