В cpp можно использовать объявление массива как typename array [size]; или typename * array = new typename [size]; Где массив имеет длину 'size', а элементы индексируются от '0' до 'size -1' Здесь мой вопрос: я могу получить доступ к элементам за пределами индекса> = size.Почему cpp позволяет получить доступ к памяти, которую я не выделил?
Так что я написал этот небольшой код, чтобы проверить его
#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
Не должен разбитой программы, но дает значение мусора. И для обоих методов распределения он дает тот же результат. Это делает больше ошибок, которые трудно обнаружить. Связано ли это с окружающей средой или компилятором, который я использую, или что-то еще?
Я использую CodeBlocks IDE, имеющего TDM-GCC 4.8.1 компилятора на окнах 8.1
Спасибо заранее.
Это не разрешено, но C++ не проверяет это автоматически, как некоторые другие языки. Преимуществом является, например. более быстрые программы, недостатком является то, что происходит, если программист делает ошибку. (Кстати, возможно, ваши текущие программы работают нормально, но это действительно ошибка и часто вызывает проблемы) – deviantfan
'int c [n];' фактически выделяет память. Его расширение компилятора GCC. –
Вы можете использовать такой инструмент, как valgrind, чтобы обнаружить такие проблемы. –