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

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

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

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

char* c = new char[length]; // how do i amend this? 

Ответ 1

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

Ответ 2

Два способа:

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

Или:

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

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

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

[Изменить: проголосуйте за ответ Фреда, char* c = new char[length]();]

Ответ 3

Возможно, используйте std::fill_n()?

char* c = new char[length];
std::fill_n(c,length,0);

Ответ 4

У С++ нет особых возможностей для этого. Однако, если вы используете std::vector вместо массива (как вы, вероятно, должны это сделать), вы можете указать значение для инициализации вектора с помощью.

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

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

Ответ 5

Форма массива new-expression принимает только одну форму инициализатора: пустой (). Это, BTW, имеет тот же эффект, что и пустой {} в вашей нединамической инициализации.

Ответ 6

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

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).

Обратите внимание: если вы выберете второй путь, вы должны перегрузить стандартный новый оператор (тот, который не имеет bool), и оператор delete. Это связано с тем, что здесь вы используете malloc(), а в стандарте указано, что операции malloc() + delete undefined. Поэтому вам нужно перегрузить delete, чтобы использовать free(), а обычный новый - malloc().

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

Ответ 7

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

Ответ 8

и неявный комментарий многими плакатами = > Не используйте массивы, используйте векторы. Все преимущества массивов без каких-либо недостатков. PLUS вы получаете много других лакомств

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

Ответ 9

вам нужно инициализировать его "вручную":

char* c = new char[length];
for(int i = 0;i<length;i++)
    c[i]='\0';