Насколько я знаю, это неопределенное поведение. Запустите большую программу с этим, и она потерпит крах где-то по пути. Проверка границ не является частью необработанных массивов (или даже std :: vector).
Вместо этого используйте std :: vector с std::vector::iterator
, чтобы вам не пришлось об этом беспокоиться.
Редактировать:
Просто для удовольствия, запустите это и посмотрите, сколько времени до аварии
int main()
{
int array[1];
for (int i = 0; i != 100000; i++)
{
array[i] = i;
}
return 0; //will be lucky to ever reach this
}
Редактировать2:
Не запускайте это.
Edit3:
Хорошо, вот небольшой урок о массивах и их отношениях с указателями:
Когда вы используете индексирование массива, вы действительно используете скрытый указатель (называемый «ссылкой»), который автоматически разыменовывается. Вот почему вместо * (array [1]) array [1] автоматически возвращает значение с этим значением.
Когда у вас есть указатель на массив, например:
int array[5];
int *ptr = array;
Тогда «массив» во втором объявлении действительно затухает до указателя на первый массив. Это поведение эквивалентно этому:
int *ptr = &array[0];
Когда вы пытаетесь получить доступ сверх того, что вы выделили, вы на самом деле просто используете указатель на другую память (на что C ++ не будет жаловаться). Если взять мой пример программы выше, это эквивалентно этому:
int main()
{
int array[1];
int *ptr = array;
for (int i = 0; i != 100000; i++, ptr++)
{
*ptr++ = i;
}
return 0; //will be lucky to ever reach this
}
Компилятор не будет жаловаться, потому что в программировании вам часто приходится общаться с другими программами, особенно с операционной системой. Это делается с помощью указателей совсем немного.