2016-09-29 4 views
0

Вот проблема, которую я встретил на днях в интервью, кто-нибудь скажет мне «правду» за этот «простой» код?Почему этот код outOfBound?

#include<stdio.h> 
int main() 
{ 
    int a[]={1,2,3}; 
    for(int i=0; i<=3; i++){ 
     a[i]=0; 
     printf("%d\n", i); 
    } 
    return 0; 
} 
+0

Неясно, в чем проблема, не могли бы вы добавить более подробную информацию? – SurvivalMachine

ответ

0

Переменная цикла i принимает значения 0, 1, 2 и 3. К сожалению, 3 представляет собой вне границ индекса для массива a, который только имеет длину 3 (юридические индексы 0, 1, и 2). Для того, чтобы избежать вне границ массива доступа, управление цикл должен быть

for(int i=0; i<3; i++){ 

Обратите внимание на использование < вместо <=. В качестве вопроса интервью цель состояла в том, чтобы проверить, заметили ли вы этот общий вид off-by-one error.

+0

Мужчина также спросил, что является худшим результатом этого кода, и я не знаю, как это описать, не могли бы вы объяснить что-то еще? Благодарю. – true2009fans

+0

ОН ..... Спасибо за ссылку «за одну ошибку», я изучаю, большое спасибо. – true2009fans

+0

@ true2009fans - Эффект написания 0 в ячейке памяти только за «a» абсолютно непредсказуем. Это полностью зависит от того, что происходит в памяти только за «a», которое, в частности, зависит от компилятора и аппаратной архитектуры. Он может варьироваться от какого-либо эффекта до краха, до передачи контроля над кодом, по которому у вас нет контроля. Фактически, переполнение буфера подобно этому является основным вектором атаки для хакеров. –

1

Все будет правильно, если < = заменяются <, поскольку это вызывает массив из связанной ошибки индекса и будет печатать значение хотя значение содержания массива будет 0 каждый раз,

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