В С++, какая разница между
char *a = new char[10];
и
char *a = new char(10);
Спасибо!
В С++, какая разница между
char *a = new char[10];
и
char *a = new char(10);
Спасибо!
Первый выделяет массив из 10 char. Второй выделяет один char, инициализированный на 10.
Или:
Первый должен быть заменен на std::vector<char>
, второй должен быть помещен в интеллектуальный указатель.
new char[10];
динамически выделяет char [10] (массив char, длина 10) с неопределенными значениями, а
new char(10);
динамически выделяет один char с целым числом 10.
char *a = new char[10];
...
delete [] a;
Вышеуказанное динамически выделяет и освобождает 10 смежных слотов памяти, которые могут использоваться для хранения символов.
char *a = new char(10);
...
delete a;
Вышеуказанное динамически выделяет и освобождает один слот памяти, который инициализируется целым значением 10
, что эквивалентно значению char '\n'
.
НЕ используйте std::vector<T>
, если вы не впервые понимаете указатели. Знание того, как распределение памяти и указатели работают , сделают вас лучшим программистом.
Я бы предпочел использовать:
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
Ну, первый сделает массив. Но я думаю, ваш вопрос в основном на втором. Ваш код может использовать его как допустимый символ, считайте:
char * x ;
cin >> *(x=new char()) ;
Будет генерировать символ динамически, а затем читать его из stdin.
[10] определяет массив, в котором (10) присваивает значение вновь созданному (единственному) символу.
Если вы хотите объявить массив размером 10 в C и по ошибке вы определяете char a (10), компилятор выдаст синтаксическую ошибку, так что вы можете ее исправить. Но в C++ он будет хорошо скомпилирован, и ваша программа может аварийно завершить работу при доступе, скажем, к [1] или при удалении a.
Поэтому в C++ всегда лучше использовать векторные, а не динамически размещаемые массивы. Я надеюсь, что вы поняли.