2015-01-31 2 views
-2

Я знаю, что «int * a = new int» используется для выделения памяти для хранения одного элемента типа int. «int * a = new int [5]» используется для выделения блока (массива) элементов типа int. Но когда я запускаю этот кодВ чем разница между «int * a = new int» и «int * a = new int [5]»?

int *a=new int; 
for(int i=0;i<4;i++) 
    a[i]=i; 
for(int i=0;i<4;i++) 
    cout<<a[i]<<endl; 

Она работает без каких-либо ошибок, и показывает правильный вывод, поэтому, когда я должен использовать «Int * а = новый Int [5]»? Или они оба одинаковы с точки зрения использования? Я использую компилятор gnu C++ в кодовых блоках.

+5

Это дает * неопределенное поведение *, и вы не можете положиться на его результаты. Это по существу доступ к массиву за пределами границ. Если вы Google, вы будете штрафовать другие сообщения [как здесь] (http://stackoverflow.com/questions/1239938/c-accesses-an-array-out-of-bounds-gives-no-error-why) –

+0

Вы доступ к памяти, не выделенный вам. Это неопределенное поведение, и этот тип ситуации в основном уникален для языков C++ (и C). – PaulMcKenzie

+0

Его схож с выполнением "int * a;" а затем использовать его. Он будет работать некоторое время, пока это не произойдет. –

ответ

5

Вы хотите пять ints. Конечно, вы должны использовать

int *a=new int[5]; 

Поскольку вы изучаете C++, имеет смысл, чтобы узнать о Undefined Behavior.

Вы можете ожидать, что C++ остановит вас или предупредит вас, если вы делаете то, что вам не следует делать, например, обработку int, как если бы это был int[5].

C++ не предназначен для отслеживания подобных ошибок. Если вы их сделаете, C++ только обещает, что он не дает никаких обещаний, что произойдет. Даже если программа работала в последний раз, когда вы ее запускали, она может не работать в следующий раз.

Смежные вопросы