Pull to refresh

C++: выход за пределы массива

В разной литературе по 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


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

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

Спасибо за внимание. Счастливых вам праздников!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.