Я бы сделал еще один шаг и сказал, что у C/C++ нет массивов. То, что у них есть, это синтаксический сахар, подобный массиву, который сразу же переводится в арифметику указателя, которая не может быть проверена, поскольку указатели могут использоваться для доступа потенциально всех памяти. Любая проверка того, что компилятор может выполнить на основе статических размеров и постоянных границ индекса, - это счастливая случайность, но вы не можете полагаться на нее.
Вот странность, что меня поразило, когда я впервые увидел его:
int a[10], i;
i = 5;
a[i] = 42; // Looks normal.
5[a] = 37; // But what's this???
std::cout << "Array element = " << a[i] << std::endl;
Но странный линия совершенно законно C++. В этом примере подчеркивается, что массивы на C/C++ являются вымыслом.
Нейл Баттерворт уже прокомментировал преимущества использования std :: vector и метода доступа at() для него, и я не могу выполнить его рекомендацию достаточно сильно. (К сожалению, дизайнеры STL взорвали прекрасную возможность сделать проверочный доступ к операторам [], при этом методы at() непроверенные. Это, вероятно, стоило сообществу разработчиков на C++ миллионов часов и миллионов долларов и будет продолжать сделайте это.)
Почему это предупреждает, когда я объявляю его локально? – user377622
@persistent, why * what *, когда вы объявляете его локально? –
@persistent вы объявляете их локально, если вам нужна переменная локального массива. то, что говорит Нил, справедливо для всех массивов в c/C++. Рассмотрите возможность использования 'std :: vector' – Andrey