Почему нет выхода за пределы массива [дубликат]

94
10 марта 2021, 22:40
На этот вопрос уже даны ответы здесь:
Почему компилятор не ловит ошибку при неправильной работе с динамической переменной (1 ответ)
Чем опасен выход за границы массива? (1 ответ)
Выход за пределы массива C++ (1 ответ)
Закрыт 1 год назад.

Задание из экзамена:

class X
{
public:
    X(int x){cout<<x-1;}
};
template <class T, int d=3>
class Container
{
    T* _arr;
public:
    Container():_arr(new T[d]){}
    void setItemAtIndex(T item, int index){ _arr[index]=item;}
    X getItemAtIndex(int index){ return _arr[index];}
};
int main(){
Container<int>container;
for (int i = 1; i < 4; ++i) {
    container.setItemAtIndex(i,i);
    X x = container.getItemAtIndex(i);
}
return 0;
}

Нужно написать скомпилится ли программа, если да то какой вывод. Вывод:012. Я не понимаю одного, когда мы создаем класс Контейнер по умолчанию рамез массива 3, когда идет цикл в мейне он идет начиная с 1, соответственно когда i=3 функция setItemAtIndex получает (3,3) и кладет 3 в место массиве 3, но разве если массив на 3 элемента последний элемент не должен быть под индексом 2?

Answer 1

Выход за пределы массива является Неопределенным Поведением. Соответственно отсутствует возможность предсказать, скомпилируется ли программа, и что именно будет результатом ее работы.

Answer 2

У массивов вида T* проверки на выход за пределы массива нет. За границей массива может лежать мусор, обращение и изменёние которого ни к чему плохому не приводит. При этом программа падать не будет.

READ ALSO
onclick на теге &lt;p&gt;

onclick на теге <p>

Необходимо посадить событие с помощью атрибута onclick на тег <p>Объясните, пожалуйста, почему в данном случае функция не вызывается?

111
С# Как спарсить адреса изображений с классом со страницы сайта?

С# Как спарсить адреса изображений с классом со страницы сайта?

Мне нужно спарсить изображения определенного класса со страницы и разместить их в WinForms

105