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

В cpp можно использовать объявление массива в качестве массиваtypename [size]; илиимя типа * массив = новое имя типа [размер]; Где массив имеет длину 'size', а элементы индексируются от '0' до 'size -1'. Здесь у меня вопрос: разрешен ли мне доступ к элементам за пределами индекса>= size.

Поэтому я написал этот маленький код, чтобы проверить это

#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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам