Подтвердить что ты не робот

Какая разница между новыми char [10] и новыми char (10)

В С++, какая разница между

char *a = new char[10];

и

char *a = new char(10);

Спасибо!

4b9b3361

Ответ 1

Первый выделяет массив из 10 char. Второй выделяет один char, инициализированный на 10.

Или:

Первый должен быть заменен на std::vector<char>, второй должен быть помещен в интеллектуальный указатель.

Ответ 2

new char[10];

динамически выделяет char [10] (массив char, длина 10) с неопределенными значениями, а

new char(10);

динамически выделяет один char с целым числом 10.

Ответ 3

char *a = new char[10];
...
delete [] a;

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

char *a = new char(10);
...
delete a;

Вышеуказанное динамически выделяет и освобождает один слот памяти, который инициализируется целым значением 10, что эквивалентно значению char '\n'.


НЕ используйте std::vector<T>, если вы не впервые понимаете указатели. Знание того, как распределение памяти и указатели работают , сделают вас лучшим программистом.

Ответ 4

Я бы предпочел использовать:

size_t size = 10; //or any other size
std::string buff(size, 0); //or: std::string buff(size, '\0');

Теперь, если вы должны использовать char * buff, вы можете использовать:

&buff[0]

Когда вам нужно использовать const char *, вы можете использовать:

buff.c_str()

Большим преимуществом является то, что вам не нужно освобождать память, stl позаботится об этом для вас. Следующее преимущество заключается в том, что вы можете использовать все строковые функции stl

Ответ 5

Ну, первый сделает массив. Но я думаю, ваш вопрос в основном на втором. Ваш код может использовать его как допустимый символ, считайте:

char * x ;
cin >> *(x=new char()) ;

Будет генерировать символ динамически, а затем читать его из stdin.

Ответ 6

[10] определяет массив, в котором (10) присваивает значение вновь созданному (единственному) символу.

Если вы хотите объявить массив размером 10 в C и по ошибке вы определяете char a (10), компилятор выдаст синтаксическую ошибку, так что вы можете ее исправить. Но в C++ он будет хорошо скомпилирован, и ваша программа может аварийно завершить работу при доступе, скажем, к [1] или при удалении a.

Поэтому в C++ всегда лучше использовать векторные, а не динамически размещаемые массивы. Я надеюсь, что вы поняли.