10. Обобщение — мать учения
Такие ошибки выявлять очень трудно, но и это еще полбеды. В Си++ допустима даже такая запись:
int x[10] ;
У = х[50];
Как ни удивительно/это не считается ошибкой и компилятор не выдаст никакого предупреждения. Во время работы программы при обращении к 50-му элементу х от начала последовательности, реально занимающей 10 ячеек (а точнее говоря, 10*4 байтов — для типа int выделяется 4 байта или 32 бита), просто будет отсчитано 50 ячеек, и то, что хранится по соответствующему адресу, будет трактоваться программой как int.
Но самое страшное случается, когда допускается ошибка, обратная приведенной:
int х[10] ;
х[50] = у;
• По адресу физической памяти, отстоящему от начала массива х на 50 элементов (50*4 байтов) будет произведена запись содержимого переменной у. А что реально записано по такому адресу, неизвестно. Может быть, это какие-то другие данные программы, которые затрутся значением переменной у, может быть, это программный код приложения, а может быть, и системная область, изменение которой приведет к краху Windows.
В языке Си++ нет никаких способов контроля за допустимостью значений индексов массивов. Эта работа полностью возлагается на программистов.
Поэтому некорректная работа с массивами и, как говорилось ранее, с указателями, так опасна. Без массивов в серьезной программе не обойтись, но для контроля за недопустимостью выхода индекса за границы массива всегда надо следить очень тщательно.
Массивы и циклы — родные братья
Для того чтобы эффективно обработать содержимое массива, удобнее всего применять циклы. Например, чтобы вычислить сумму всех элементов массива
int х[100] ;
можно использовать такой код на Си++:
int i, sum; // i - счетчик
178