Если вы немного измените свою программу:
#include <iostream>
using namespace std;
int main()
{
int array[2];
INT NOTHING;
CHAR FOO[4];
STRCPY(FOO, "BAR");
array[0] = 1;
array[1] = 2;
array[3] = 3;
array[4] = 4;
cout << array[3] << endl;
cout << array[4] << endl;
COUT << FOO << ENDL;
return 0;
}
(Изменения в заглавных буквах - ставьте их в нижнем регистре, если вы собираетесь попробовать это).
Вы увидите, что переменная foo уничтожена. Ваш код будет сохранять значения в несуществующем массиве [3] и массиве [4] и сможет правильно их извлекать, но фактическое используемое хранилище будет из foo .
Таким образом, вы можете «уйти» с превышением границ массива в вашем первоначальном примере, но ценой нанесения ущерба в другом месте - повреждения, который может оказаться очень трудно диагностируемым.
Относительно того, почему нет автоматической проверки границ - правильно написанной программе это не нужно. Как только это будет сделано, нет причин выполнять проверку границ во время выполнения, и это просто замедлит работу программы. Лучше всего, чтобы все выяснилось при разработке и кодировании.
C ++ основан на C, который был разработан как можно ближе к языку ассемблера.