10 ответов:
два варианта:
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);[Edit: go vote for Fred's answer,
char* c = new char[length]();]
возможно использовать
std::fill_n()?char* c = new char[length]; std::fill_n(c,length,0);
C++ не имеет конкретной функции для этого. Однако, если вы используете std:: vector вместо массива (как вы, вероятно, должны делать), вы можете указать значение для инициализации вектора.
std::vector <char> v( 100, 42 );создает вектор размера 100 со всеми значениями, инициализированными до 42.
форма массива new-expression принимает только одну форму инициализатора: пустой
(). Это, кстати, имеет тот же эффект, что и пустой{}в вашем динамическая инициализация.
вышесказанное относится к языку pre-C++11. Начиная с C++11 можно использовать единый синтаксис инициализации с массивом new-expressions
char* c = new char[length]{}; char* d = new char[length]{ 'a', 'b', 'c' };
вы не можете сделать это в одной строке легко. Вы можете сделать:
char* c = new char[length]; memset(c, 0, length);или, можно перегрузить оператор new:
void *operator new(size_t size, bool nullify) { void *buf = malloc(size); if (!buf) { // Handle this } memset(buf, '', size); return buf; }тогда вы сможете сделать:
char* c = new(true) char[length];пока
char* c = new char[length];будет поддерживать старое поведение. (Обратите внимание, если вы хотите все
news, чтобы обнулить то, что они создают, вы можете сделать это, используя то же самое выше, но вынимаяbool nullifyчасть).отметим, что если вы выберете второй путь, вы должны перегрузить стандартный оператор new (тот, что без bool) и оператор delete тоже. Это потому, что здесь вы используете
malloc(), и стандарт говорит, чтоmalloc()+deleteоперации не определены. Так что вам придется перегружатьdeleteиспользоватьfree(), и нормальное новое для использованияmalloc().на практике, хотя все реализации используют malloc () / free () сами по себе, поэтому даже если вы этого не сделаете, скорее всего, вы не столкнетесь с какими-либо проблемами (кроме языковых юристов, кричащих на ты)
С c++11 мы могли бы использовать инициализации:
char* c = new char[length]{};для агрегатного типа, то агрегатной инициализации будет выполняться, что имеет тот же эффект, что и
char c[2] = {};.
и неявный комментарий многих плакатов = > не используйте массивы, используйте векторы. Все преимущества массивов без каких-либо недостатков. Плюс вы получаете много других вкусностей
Если вы не знаете STL, прочитайте Josuttis стандартную библиотеку C++ и Meyers effective STL
вы должны инициализировать его "от руки" :
char* c = new char[length]; for(int i = 0;i<length;i++) c[i]='';
Comments