Ответ 1
char* c = new char[length]();
Как достичь динамического эквивалента этой инициализации статического массива:
char c[2] = {}; // Sets all members to '\0';
Другими словами, создайте динамический массив со всеми значениями, инициализированными символом завершения:
char* c = new char[length]; // how do i amend this?
char* c = new char[length]();
Два способа:
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]();
]
Возможно, используйте std::fill_n()
?
char* c = new char[length];
std::fill_n(c,length,0);
У С++ нет особых возможностей для этого. Однако, если вы используете std::vector вместо массива (как вы, вероятно, должны это сделать), вы можете указать значение для инициализации вектора с помощью.
std::vector <char> v( 100, 42 );
создает вектор размера 100 со всеми значениями, инициализированными до 42.
Форма массива new-expression принимает только одну форму инициализатора: пустой ()
. Это, BTW, имеет тот же эффект, что и пустой {}
в вашей нединамической инициализации.
Вы не можете сделать это в одной строке легко. Вы можете сделать:
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(), поэтому, даже если вы этого не сделаете, скорее всего, вы не столкнетесь с какими-либо проблемами (за исключением того, что юристы на языке кричат на вас)
Нет внутренних средств, AFAIK. Использовать это: memset (c, 0, length);
и неявный комментарий многими плакатами = > Не используйте массивы, используйте векторы. Все преимущества массивов без каких-либо недостатков. PLUS вы получаете много других лакомств
Если вы не знаете STL, прочитайте Josuttis Стандартная библиотека С++ и meyers эффективная STL
вам нужно инициализировать его "вручную":
char* c = new char[length];
for(int i = 0;i<length;i++)
c[i]='\0';
Так как С++ 11 мы могли бы использовать инициализацию списка:
char* c = new char[length]{};
Для агрегатного типа будет выполняться агрегатная инициализация, которая имеет тот же эффект, что и char c[2] = {};
.