почему cpp позволяет получить доступ к памяти, которую я не выделил?

В 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

Заранее спасибо.

-3

Решение

Компиляторы c ++ не применяют это, так как для этого нет никакой спецификации.

Когда вы обращаетесь к элементу массива, проверка границ не выполняется. c[i] просто переводится на c + i * sizeof(int) и это все. Если эта область памяти не инициализируется, вы получите мусор, но вы можете получить другую полезную информацию, все зависит от того, что там есть.

Обратите внимание, что в зависимости от операционной системы и времени выполнения c ++ вы можете получить разные результаты, например, на Linux-коробке вы, вероятно, получите segmentation fault и программа вылетит.

0

Другие решения

Это называется «неопределенное поведение» в стандарте C ++.

Неопределенное поведение может означать любое из следующего:

  • Вылетает программа

  • Программа продолжает работать, но выдает бессмысленные, мусорные результаты

  • Программа продолжает работать, автоматически копирует все содержимое вашего жесткого диска и размещает его на Facebook

  • Программа продолжает работать и автоматически подписывает вас на лотереи Clearinghouse издателей.

  • Программа продолжает работать, но ваш компьютер загорается и взрывается

  • Программа продолжает работать и обеспечивает самосознание вашего компьютера, который автоматически связывает и объединяет сети с другими самосознающими сетями, образуя Skynet и уничтожая человеческую расу.

Вывод: не запускайте и не получайте доступ к элементам после конца ваших массивов.

1

По вопросам рекламы [email protected]