Действительно ли я могу инициализировать массив круглыми скобками?

#c #constructor #new-operator

#c #constructor #new-operator

Вопрос:

Иногда я допускаю опечатку в одном месте кода моей программы:

 int a = 10;  
char* b = new char(a);
  

Ошибка очевидна: я написал () вместо [] . Странная вещь … код скомпилирован нормально, он нормально запускался в отладчике. Но скомпилированный .exe вне отладчика разбился через мгновение после выполнения функции с этими строками.

Действительно ли вторая строка кода допустима? И если да, то что это значит для компилятора?

Ответ №1:

В данном случае это один символ с числовым значением a 10 . Указатели указывают не только на массивы, вы знаете.

Ответ №2:

Вы выделяете единицу char и присваиваете ей значение из a . Это вообще не выделение массива.

Это то же самое, что вызывать конструктор в new выражении для любого другого типа:

 std::string* s = new std::string("foo");
int* i = new int(10);
std::vector<std::string>* v = new std::vector<std::string>(5, "foo");
  

Ответ №3:

char t(a) создает локальный символ, инициализированный значением a .
new char (a) создает динамически выделяемый символ, инициализированный значением a .