полосатый фон с двумя цветами?

Когда вы обращаетесь к индексу массива, C и C ++ не выполняют проверку привязки. Ошибки сегментации возникают только при попытке чтения или записи на страницу, которая не была выделена (или попытаться сделать что-то на странице, которая не разрешена, например, попытка записи на страницу только для чтения), но поскольку страницы обычно довольно большой (кратные несколько килобайт, в Mac OS, кратные 4 КБ), он часто оставляет вам много места для переполнения.

Если ваш массив находится в стеке (например, ваш), он может быть еще хуже, поскольку стек обычно довольно большой (до нескольких мегабайт). Это также является причиной проблем безопасности: запись за пределы массива в стеке может перезаписать обратный адрес функции и привести к произвольному выполнению кода (известные нарушения безопасности переполнения буфера).

Значения, которые вы получаете при чтении, - это то, что происходит в этом конкретном месте. Они полностью не определены.

Если вы используете C ++ (и вам повезло работать с C ++ 11), стандарт определяет тип std::array<T, N>, который является массивом, который знает свои границы. Метод at будет бросаться, если вы попытаетесь прочитать его конец.

13
задан Nibha Jain 4 January 2012 в 23:56
поделиться