2013-03-09 3 views
1

Я знаю, что int* array = new int [n]; выделяет пространство памяти в куче.Объявление динамического массива разными способами

Но если я объявляю что-то вроде этого: int array[n]; в кодовых блокирах, он скомпилируется успешно, но если я переведу его в визуальную студию, это выходит из-за ошибки.

То, что я хочу спросить:

  1. Что int[n] действительно делать и как она соотносится с выделением кучи? В чем разница между ними?

  2. Какая ошибка может возникнуть, если я использую int array[n] вместо int* array = new int [n];?

+3

Переменная длина не должна использоваться для массивов статического размера. Codeblocks принимает это, потому что GCC, вероятно, поддерживает его как extenstion. – 0x499602D2

+4

Взято из документов GCC: 'Автоматические массивы переменной длины разрешены в ISO C99, а в качестве расширения GCC принимает их в режиме C90 и на C++.' – chris

ответ

4

int array[n] объявляет массив в стеке, а не кучу. В стандарте C++ n должна быть константой времени компиляции, однако некоторые компиляторы имеют расширение, которое допускает массивы переменной длины, объявленные в этой форме, без постоянной времени компиляции n. Он не является стандартным и, вероятно, не должен использоваться.

int array[n] может вызвать пару проблем над int* array = new int [n];:

  • Если n большой достаточно, то вы можете вызвать переполнение стека. Или, если массив является членом класса, и вы создаете большой массив класса.
  • Если array является членом класса перемещения может быть столь же дорого, как копирование
  • Если array является членом класса, и вы выдали указатели на массив и move класса, указатели в настоящее время относятся к сообщению или объект случайной памяти, если объект также был уничтожен. В любом случае, плохо.
+0

Так возникает какая-либо потенциальная проблема, когда я использую 'int array [n ] '? –

+0

Тогда почему некоторые компиляторы делают расширения для него? Thx –

+1

@ Liang-YuPan [Проблемы с массивами] (http://www.drdobbs.com/the-new-cwhy-variable-length-arrays/184401444) –

3

GCC имеет расширение в C++, что позволяет int array[n], где n не является постоянной величиной времени компиляции. Стандартный язык не позволяет использовать непостоянное значение для n в таком случае (разрешено в C99).

3

Если я правильно понимаю ваши вопросы, тогда я могу ответить на оба вопроса.

  1. int array[10] выделяется в стеке, в то время как int *array = new int[10] выделяется в куче. Обычно массивы стека работают только с постоянным количеством элементов, поэтому int array[n] не разрешен в C90 (до тех пор, пока n не является константой).

  2. MinGW (который является версией GCC компилятора, который CodeBlocks использует на окнах), имеет расширение, которое действительно позволяет писать int array[n] в режиме C90, где n не является постоянным. Visual C++ этого не допускает.

2

, когда вы пишете int array[n], это означает, что вы выполняете статическое распределение. то есть память будет выделяться во время компиляции. Поэтому использование переменной длины здесь приведет к ошибке времени компиляции.

+0

Тогда почему он работал над кодовыми блоками (прочитал вопрос)? – antonijn

+1

ну, antonijn ответил, что ... –

+1

Я antonijn ... – antonijn

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