Страницы

Поиск по вопросам

вторник, 30 октября 2018 г.

Доступ за пределами размера массива

Изучаю основные возможности С++ и вот такой код :
int mas[12];
mas[15]=15; cout<<"15 element = "<";
по непонятным мне причинам работает. Ведь это выход за границы массива ?


Ответ

C++ — небезопасный язык.
Правила языка говорят, что нельзя выходить за границы выделенной памяти. Ответственность за выполнение правил возлагается на вас, программиста. C++, в отличие от безопасных языков, не проверяет, следуете ли вы правилам, поэтому вы не получите ошибку непосредственно в этой точке.
Но раз вы нарушили правила, может случиться любая неприятность. Стандарт подчёркивает, что при нарушении вами правил все гарантии языка снимаются.
При чтении за границами массива, если вам повезёт, и память по смещению в 15 размеров элемента от начала массива доступна, и не содержит ничего плохого (на интеловской архитектуре «плохого» не бывает, но на других вполне) и если оптимизатор не очень умный, вы просто прочитаете какое-то непонятное значение.
В случае, если вам повезёт меньше, программа просто упадёт.
А в совсем плохом случае программа начнёт вести себя странно, причём в каком-то далёком, не связанном с этой точкой месте.
При записи всё ещё хуже, по этому адресу может случайно оказаться какая-нибудь важная структура данных (например, это может быть адрес возврата из текущей функции), и вы перезапишете его каким-то непонятным значением по принципу «на кого бог пошлёт».
Просто не делайте так, C++ доверяет вам.

Комментариев нет:

Отправить комментарий