В КУРСЕ?

Разбираемся в теме

Массив из восьми элементов в C: почему индекс восемь уже выходит за границу?

В программировании на C номер канала или элемента может поступать из внешнего сообщения. Даже если источник кажется надёжным, значение нужно проверить до обращения к массиву. Для промышленного программного обеспечения такая дисциплина особенно важна. Разберём изолированный учебный массив, который не подключён к оборудованию и не управляет исполнительными устройствами.

Количество элементов и последний индекс различаются

У массива int samples[8] есть восемь элементов с индексами от нуля до семи. Ноль обозначает первый элемент, семь восьмой. Индекс восемь не означает последний допустимый элемент: он находится сразу за диапазоном доступных элементов. Представим, что массив хранит условные значения 10, 20, 30, 40, 50, 60, 70 и 80. Запрос индекса 0 должен вернуть 10, а индекса 7 значение 80. Запросы -1, 8 и 200 не должны приводить к чтению элемента. Сначала определяется допустимость, и только затем выполняется обращение.

Проверяйте обе границы заранее

Для знакового целочисленного индекса в этом простом примере нужны два условия: значение не меньше нуля и меньше восьми. Проверка только верхней границы пропустит отрицательные значения. Проверка индекса после чтения слишком поздняя: недопустимое обращение уже могло произойти. В обычном C доступ за границами массива не сопровождается обязательной автоматической проверкой. Он приводит к неопределённому поведению, поэтому нельзя рассчитывать на одинаковое аварийное завершение или удобное сообщение. Программа иногда может внешне продолжать работу, но это не делает обращение допустимым. Проверка должна быть частью логики до доступа к памяти.

Ошибку входа отделяйте от значения элемента

Если ноль является допустимым результатом измерения, возвращать его как единственный признак неправильного индекса неудобно. Вызывающая часть не сможет отличить корректное значение от отказа. Полезно передавать отдельно признак успеха и результат, используя соглашение, понятное всем участникам программы. В учебной функции можно сначала проверить индекс, при недопустимом значении сообщить об отказе, а при допустимом заполнить отдельную переменную результата. Это не готовая промышленная архитектура, а принцип разделения состояния операции и данных. В реальной системе также проверяют формат внешнего сообщения, преобразование чисел, размеры и остальные ограничения протокола.

Проверяйте крайние случаи в изолированной среде

Набор только из средних допустимых индексов плохо проверяет границы. Полезны значения непосредственно перед началом, первый элемент, последний элемент и первое значение после конца. Для массива из восьми элементов это -1, 0, 7 и 8. Дополнительное большое значение помогает проверить, что логика не рассчитана лишь на соседнюю ошибку. Учебные проверки выполняют без подключения к реальным приводам и другим исполнительным устройствам. Корректный доступ к массиву не доказывает безопасность управления всей машиной: остаются синхронизация, проверка состояния, обработка отказов и требования оборудования. Также следует учитывать типы при сравнении: смешение знаковых и беззнаковых величин имеет отдельные правила и требует внимания.

Попробуйте на практике

Составьте таблицу проверки индекса для учебного массива из восьми значений: 10, 20, 30, 40, 50, 60, 70, 80.

  1. Запишите допустимый диапазон от нуля до семи и объясните, почему количество элементов равно восьми.
  2. Для индексов -1, 0, 7, 8 и 200 заранее отметьте разрешённый доступ или отказ.
  3. Для разрешённых случаев укажите ожидаемые значения, не выполняя чтение в остальных случаях.
  4. Опишите результат операции двумя отдельными полями: успешность и значение при успехе.
  5. Проверьте, что обе границы рассматриваются до доступа и что учебный пример не содержит команд реальному оборудованию.

Как проверить результат. Только индексы 0 и 7 из предложенного набора разрешены и дают значения 10 и 80. Остальные отклоняются до обращения к массиву; отказ не смешивается с допустимым измерением.

Частые вопросы

Если программа не упала, выход за границы безопасен?

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

Можно ли один раз проверить внешний номер и забыть о границах?

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

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

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов