10. Обобщение — мать учения

Такие ошибки выявлять очень трудно, но и это еще полбеды. В Си++ допустима даже такая запись:

int x[10] ;

У = х[50];

Как ни удивительно/это не считается ошибкой и компилятор не выдаст никакого предупреждения. Во время работы программы при обращении к 50-му элементу х от начала последовательности, реально занимающей 10 ячеек (а точнее говоря, 10*4 байтов — для типа int выделяется 4 байта или 32 бита), просто будет отсчитано 50 ячеек, и то, что хранится по соответствующему адресу, будет трактоваться программой как int.

Но самое страшное случается, когда допускается ошибка, обратная приведенной:

int х[10] ;

х[50] = у;

• По адресу физической памяти, отстоящему от начала массива х на 50 элементов (50*4 байтов) будет произведена запись содержимого переменной у. А что реально записано по такому адресу, неизвестно. Может быть, это какие-то другие данные программы, которые затрутся значением переменной у, может быть, это программный код приложения, а может быть, и системная область, изменение которой приведет к краху Windows.

h01781.jpg

В языке Си++ нет никаких способов контроля за допустимостью значений индексов массивов. Эта работа полностью возлагается на программистов.

Поэтому некорректная работа с массивами и, как говорилось ранее, с указателями, так опасна. Без массивов в серьезной программе не обойтись, но для контроля за недопустимостью выхода индекса за границы массива всегда надо следить очень тщательно.

Массивы и циклы — родные братья

Для того чтобы эффективно обработать содержимое массива, удобнее всего применять циклы. Например, чтобы вычислить сумму всех элементов массива

int х[100] ;

можно использовать такой код на Си++:

int i, sum; // i - счетчик

178