В разной литературе по C/C++ говорится, что выход за пределы статических и динамических массивов не проверяется компилятором. При попытке записать данные за границу массива будет получена ошибка сегментации при выполнении программы.
Но это не всегда так. Приведу два интересных примера.
Первый пример:
Выделив память на целочисленный массив а из девяти элементов, мы записываем одиннадцатому элементу значение 777. Затем выделяем память под указатель на int (она выделяется не сразу после массива a, а через 1 байт). Выполняем программу и видим на экране 777. При выполнении программы не произошло ошибки сегментации, что является настораживающим фактором для программиста.
Второй пример
На этот раз объявим статический массив из пяти элементов, и присвоим 901ому элементу значение 777. Выводим это значение на экран. Запустим получившуюся программу несколько раз подряд:
Как видим, в большинстве случаев программа срабатывает, и при отладке программист может посчитать что программа рабочая. Но в реальных условиях при многократном запуске могут появляться проблемы, которые потом программисту будет трудно устранять.
К чему я это все написал: при разработке программного обеспечения уделяйте большое внимание работе с индексами массивов(указателей), не ленитесь многократно проверять код, чтобы избежать трудноразрешимых, непонятно откуда взявшихся ошибок.
Спасибо за внимание. Счастливых вам праздников!
Но это не всегда так. Приведу два интересных примера.
Первый пример:
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
Как видим, в большинстве случаев программа срабатывает, и при отладке программист может посчитать что программа рабочая. Но в реальных условиях при многократном запуске могут появляться проблемы, которые потом программисту будет трудно устранять.
К чему я это все написал: при разработке программного обеспечения уделяйте большое внимание работе с индексами массивов(указателей), не ленитесь многократно проверять код, чтобы избежать трудноразрешимых, непонятно откуда взявшихся ошибок.
Спасибо за внимание. Счастливых вам праздников!