Вне индекса C / C ++

0

Типичным объявлением для массива в C/C++ является:

имя типа [элементы];

где type является допустимым типом (например, int, float...), имя является допустимым идентификатором и полем элементов (которое всегда заключено в квадратные скобки []), задает длину массива в терминах количества элементы.

Поэтому я объявляю, что массив int имеет 2 элемента

int a[2];
a[3] =4;

Почему это не исключение?

Теги:
arrays
indexing

2 ответа

2
Лучший ответ

Проверка вне границ - это то, к чему вы, вероятно, привыкли использовать некоторые языки более высокого уровня, такие как Java. Однако в C/C++ оно не выполняется по умолчанию. Это дает вам небольшой успех, чтобы проверить границы массива, и поэтому логическое обоснование C состоит в том, чтобы вы делали это вручную, если вам нужно, чтобы обеспечить наилучшую производительность. C++ Контейнеры STL, такие как vector обычно поддерживают операцию at() для выполнения проверки границ, и поскольку вы можете перегрузить [] -operator, вы также можете включить связанные проверки доступа к массиву.

Если array является необработанным указателем, в C/C++ сводится инструкция типа array[i] ]:

*(array + i)

который является простым добавлением адреса + смещения. Таким образом, следующие утверждения эквивалентны:

*(array + i), *(i + array), array[i], i[array]

Что происходит внутри, так это то, что вы берете адрес, хранящийся в указателе, добавляете i-times размер массива к нему, а затем де-ссылку на этот адрес.

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

0

"a" - это просто указатель на первый элемент (этого массива) в памяти. некоторые компиляторы позволят вам получить доступ к другим частям памяти без предупреждения. для правильного использования массива, см. http://www.cplusplus.com/doc/tutorial/arrays/, т.е. используйте что-то вроде

#define MAX 5
int main(){
  int a[MAX];
  for(int i=0;i<MAX;i++){
     a[i]=i;
  }
}
  • 0
    Что происходит, когда компилятор видит [5], и что происходит, когда мы получаем доступ к [6]?
  • 0
    @ user3441187 - Поведение не определено. Может произойти все что угодно - сбой, запуск без ошибок, перезапись значения какой-либо другой переменной и т. Д. В отличие от других языков программирования, C ++ не дает сбоя автоматически и выдает своего рода «трассировку стека», когда вы что-то делаете неправильно.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню