2014-02-07 2 views
-1

Я изучаю C++, и, насколько я понимаю, массив не должен заполняться, если вы попытаетесь присвоить ему значение, которое является недопустимым из-за ограничения размера, размещенного в массиве, пока следующий код правильно выводит 232:C++: Создание индекса массива больше размера, не вызывающего ошибки

int stuff[5]; 
stuff[7] = 232; 
cout<<stuff[7]; 

Я сожалею, если это невероятно глупый вопрос, но это как раз то, что мой компилятор латать перед тем время выполнения?

+1

Это как сказать: «Смотрите, я * могу * держать мяч в моих руках» в баскетболе. –

+2

Похоже, что у меня были сняты мои водительские права, так почему я могу попасть в машину и водить ее? – PaulMcKenzie

+0

Это как игрок в баскетболе, говорящий «Смотри, я могу держать мяч в моих руках», а затем решил, будет ли он продолжать играть таким образом, основываясь на местах других игроков. –

ответ

6

Запись вне границ массива - это неопределенное поведение, что означает, что результаты могут быть любыми. В частности, компилятору не требуется добавлять какие-либо проверки границ времени выполнения, из-за чего выдается сообщение об ошибке (и большинство компиляторов этого не делают, поскольку это более эффективно не для).

Так что, вероятно, происходит то, что значение записывается в ячейку памяти за конец массива. Если там что-то важное сохранилось, произойдет что-то плохое; или если что бы ни случилось в этом месте, это не так важно, вы не заметите какого-либо конкретного эффекта. Вы не можете полагаться на то, что это безвредно, поэтому не делайте этого. :)

+0

Отлично, это тот ответ, который мне нужен. Я не был доволен другим, более расплывчатым ответом. –

+0

Есть ли способ увидеть или даже контролировать точное «местоположение» в памяти, на которое будет выделено что-то? –

+0

Ну, есть новое место, но вы не хотите его использовать, если не знаете, что делаете. В общем, компилятор будет делать гораздо лучшую и более надежную работу по размещению вещей в подходящем месте, чем человеческая воля. Попытка сделать свою работу за это только сделает его и вас несчастным. ;) –

2

Доступ к массиву за пределами результатов приводит к неопределенному поведению. Это может сработать, это может дать неправильный ответ, это может привести к сбою программы.

+0

Что определяет результат? Компилятор? Операционная система? Аппаратные средства? –

+2

Да для обоих. Также удачи. – Adam

+0

@Adam Такая уверенность. : P –

Смежные вопросы