В разной литературе по C/C++ говорится, что выход за пределы статических и динамических массивов не проверяется компилятором. При попытке записать данные за границу массива будет получена ошибка сегментации при выполнении программы.

Но это не всегда так. Приведу два интересных примера.

Первый пример:
int main()
{
int* a = new int[9];
a[10] = 777;
int* b = new int;
std::cout << *b << std::endl;
return 0;
}

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

Второй пример

int main()
{
int a[5];
a[900] = 777;
std::cout << a[900] << std::endl;
return 0;
}

На этот раз объявим статический массив из пяти элементов, и присвоим 901ому элементу значение 777. Выводим это значение на экран. Запустим получившуюся программу несколько раз подряд:

nathan@eeepc:~/prog/cpp/test$ ./a.out
777
nathan@eeepc:~/prog/cpp/test$ ./a.out
777
nathan@eeepc:~/prog/cpp/test$ ./a.out
777
nathan@eeepc:~/prog/cpp/test$ ./a.out
777
nathan@eeepc:~/prog/cpp/test$ ./a.out
Ошибка сегментирования
nathan@eeepc:~/prog/cpp/test$ ./a.out
777
nathan@eeepc:~/prog/cpp/test$ ./a.out
777


Как видим, в большинстве случаев программа срабатывает, и при отладке программист может посчитать что программа рабочая. Но в реальных условиях при многократном запуске могут появляться проблемы, которые потом программисту будет трудно устранять.

К чему я это все написал: при разработке программного обеспечения уделяйте большое внимание работе с индексами массивов(указателей), не ленитесь многократно проверять код, чтобы избежать трудноразрешимых, непонятно откуда взявшихся ошибок.

Спасибо за внимание. Счастливых вам праздников!