Когда вы обращаетесь к индексу массива, C и C ++ не выполняют проверку границ.Ошибки сегментации возникают только при попытке чтения или записи на страницу, которая не была выделена (или при попытке сделать что-то на странице, которая не разрешена, например, при попытке записи на страницу только для чтения), но поскольку страницы обычнодовольно большой (кратно нескольким килобайтам; в Mac OS - 4 КБ), часто остается много места для переполнения.
Если ваш массив находится в стеке (например, у вас), он можетбыть еще хуже, поскольку стек обычно довольно большой (до нескольких мегабайт).Это также является причиной проблем безопасности: запись за пределы массива в стеке может перезаписать адрес возврата функции и привести к выполнению произвольного кода (известные нарушения безопасности «переполнения буфера»).
Значения, которые вы получаете, когда читаете, как раз и существуют в этом конкретном месте.Они полностью не определены .
Если вы используете C ++ (и вам повезло работать с C ++ 11), стандарт определяет тип std::array<T, N>
, который является массивом, который знаетего границы.Метод at
сгенерирует, если вы попытаетесь прочитать после его окончания.