Типичным объявлением для массива в C/C++ является:
имя типа [элементы];
где type является допустимым типом (например, int, float...), имя является допустимым идентификатором и полем элементов (которое всегда заключено в квадратные скобки []), задает длину массива в терминах количества элементы.
Поэтому я объявляю, что массив int имеет 2 элемента
int a[2];
a[3] =4;
Почему это не исключение?
Проверка вне границ - это то, к чему вы, вероятно, привыкли использовать некоторые языки более высокого уровня, такие как 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.
"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;
}
}