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

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

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

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

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

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

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

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

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

 *(array + i) 

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

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

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

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

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

 #define MAX 5 int main(){ int a[MAX]; for(int i=0;i