В cpp можно использовать объявление массива как
массив typename [размер];
или же
имя типа * массив = новое имя типа [размер];
Где массив имеет длину ‘size’, а элементы индексируются от ‘0’ до ‘size -1’
Здесь мой вопрос: мне разрешен доступ к элементам за пределами индекса> = размера.
Поэтому я написал этот маленький код, чтобы проверить это
#include <iostream>
using namespace std;
int main()
{
//int *c; //for dynamic allocation
int n; //length of the array c
cin>>n; //getting the length
//c = new int[n]; //for dynamic allocation
int c[n]; //for static allocation
for(int i=0; i<n; i++) //getting the elements
cin>>c[i];
for(int i=0; i<n+10; i++) //showing the elements, I have add up 10
cout<<c[i]<<" "; //with size to access the memory I haven't
//allocated for
return 0;
}
И результат такой
2
1 2
1 2 2686612 1970422009 7081064 4199040 2686592 0 1 1970387429 1971087432 2686700
Программа не должна аварийно завершить работу, но выдает значения мусора. И для обоих методов выделения это дает одинаковый результат. Это делает больше ошибок, которые трудно обнаружить. Это связано со средой или компилятором, который я использую, или с чем-то еще?
Я использовал IDE кодовых блоков с компилятором TDM-GCC 4.8.1 на Windows 8.1
Заранее спасибо.
Компиляторы c ++ не применяют это, так как для этого нет никакой спецификации.
Когда вы обращаетесь к элементу массива, проверка границ не выполняется. c[i]
просто переводится на c + i * sizeof(int)
и это все. Если эта область памяти не инициализируется, вы получите мусор, но вы можете получить другую полезную информацию, все зависит от того, что там есть.
Обратите внимание, что в зависимости от операционной системы и времени выполнения c ++ вы можете получить разные результаты, например, на Linux-коробке вы, вероятно, получите segmentation fault
и программа вылетит.
Это называется «неопределенное поведение» в стандарте C ++.
Неопределенное поведение может означать любое из следующего:
Вылетает программа
Программа продолжает работать, но выдает бессмысленные, мусорные результаты
Программа продолжает работать, автоматически копирует все содержимое вашего жесткого диска и размещает его на Facebook
Программа продолжает работать и автоматически подписывает вас на лотереи Clearinghouse издателей.
Программа продолжает работать, но ваш компьютер загорается и взрывается
Программа продолжает работать и обеспечивает самосознание вашего компьютера, который автоматически связывает и объединяет сети с другими самосознающими сетями, образуя Skynet и уничтожая человеческую расу.
Вывод: не запускайте и не получайте доступ к элементам после конца ваших массивов.