Как Вы инициализируете динамический массив в C++?

Как делают я достигаю динамического эквивалента этой статической инициализации массива:

char c[2] = {};  // Sets all members to '\0';

Другими словами, создайте динамический массив со всеми значениями, инициализированными к символу завершения:

char* c = new char[length]; // how do i amend this? 
56
задан tgh 8 January 2010 в 18:10
поделиться

9 ответов

char* c = new char[length]();
104
ответ дан 26 November 2019 в 17:04
поделиться
[

] Форма массива нового выражения принимает только одну форму инициализатора: пустую []()[]. Это, BTW, имеет тот же эффект, что и пустая []{}[] в вашей нединамической инициализации.[

] [
] [

]Вышеизложенное относится к языку до-C++11. Начиная с языка Си++11 можно использовать единый синтаксис инициализации с новыми выражениями массивов[

] [
char* c = new char[length]{};
char* d = new char[length]{ 'a', 'b', 'c' };
]
9
ответ дан 26 November 2019 в 17:04
поделиться

Может быть, использовать std :: fill_n () ?

char* c = new char[length];
std::fill_n(c,length,0);
17
ответ дан 26 November 2019 в 17:04
поделиться

Два способа:

char *c = new char[length];
std::fill(c, c + length, INITIAL_VALUE);
// just this once, since it's char, you could use memset

или:

std::vector<char> c(length, INITIAL_VALUE);

во втором пути, второй параметр по умолчанию уже 0, поэтому в вашем случае это ненужно:

std::vector<char> c(length);

[РЕДАКТИРОВАНИЕ: Голосуйте за ответ FRED, CHAR * C = NEW CHAR [Длина] (); ]

30
ответ дан 26 November 2019 в 17:04
поделиться

C ++ не имеет определенной функции для этого. Однако, если вы используете STD :: Vector вместо массива (как вы, вероятно, должны делать), вы можете указать значение для инициализации вектор с.

std::vector <char> v( 100, 42 );

создает вектор размера 100 со всеми значениями инициализированными на 42.

5
ответ дан 26 November 2019 в 17:04
поделиться

Никаких внутренних средств, AFAIK. Использовать это: memset (c, 0, длина);

1
ответ дан 26 November 2019 в 17:04
поделиться

Быстрый поиск в Google приводит пример, такой как Статья C-Sharpcorner

-121--4817955-

Это боль, но то, как я делаю это, это старомодно, написав ио:формат в функции запуска приложения (то есть код модуля с поведением приложения) и отрабатывает, какая строка терпит неудачу: (

Иногда грубая сила и невежество - ваш единственный человек...

-121--4648591-

и неявный комментарий многих плакатов = > Dont use arrays, use vectors. Все преимущества массивов без недостатков. PLus вы получаете много других вкусностей

Если вы не знаете STL, прочитайте Josuttis Стандартная библиотека C++ и meyers effective STL

1
ответ дан 26 November 2019 в 17:04
поделиться

Вы не можете легко сделать это в одну строку. Вы можете сделать:

char* c = new char[length];
memset(c, 0, length);

или, вы можете перегружать новый оператор:

void *operator new(size_t size, bool nullify)
{
    void *buf = malloc(size);

    if (!buf) {
             // Handle this
    }

    memset(buf, '\0', size);

    return buf;
}

, тогда вы сможете сделать:

char* c = new(true) char[length];

, а

char* c = new char[length];

будет поддерживать старое поведение. (Примечание, если вы хотите все New , чтобы отделить то, что они создают, вы можете сделать это, используя то же самое, но вынимая Bool Nullify часть).

Обратите внимание, что если вы выберете второй путь, вы должны перегружать стандартный новый оператор (тот, который без боля) и оператор удаления тоже. Это связано с тем, что здесь вы используете malloc () , и стандарт говорит, что Malloc () + Удаление Операции не определены. Таким образом, вы должны перегружать Удалить , чтобы использовать бесплатно () , а нормальный новый для использования Malloc () .

На практике, хотя все реализации используют Malloc () / Free () сами внутренне, поэтому, даже если вы этого не сделаете, скорее всего, вы не будете бежать в какие-либо проблемы (кроме языковых адвокатов, кричащих на вас)

3
ответ дан 26 November 2019 в 17:04
поделиться

Вы должны инициализировать его «вручную»:

char* c = new char[length];
for(int i = 0;i<length;i++)
    c[i]='\0';
0
ответ дан 26 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: