2010-06-28 3 views

ответ

52
char * msg = new char[65546](); 

Он известен как ценностной инициализации, и был введен в C++ 03. Если вам случится оказаться в ловушке в предыдущее десятилетие, вам нужно будет использовать std::fill() (или memset(), если вы хотите притвориться, что это C).

Обратите внимание, что это не будет работать ни для какого значения, кроме нуля. Я думаю, что C++ 0x предложит способ сделать это, но я немного отстаю от времени, поэтому я не могу комментировать это.

ОБНОВЛЕНИЕ: кажется, мои размышления о прошлом и будущем языка не совсем точны; см. комментарии для исправлений.

+0

+1 для идеального решения :-). –

+0

Это очень хорошо работает, поскольку 0 является интегральным значением по умолчанию для 'char'. –

+5

@ Эрик, который не имеет ничего общего с ООП: S –

4
memset(msg, 0, 65546) 
+0

Помните '#include ' –

+0

Является ли sizeof (char) гарантией 1? Я никогда не видел, чтобы этого не было, но если бы это не было гарантировано стандартом, я бы использовал «memset (msg, 0,65546 * sizeof (char))», просто чтобы быть уверенным. –

+9

@Paul: 'sizeof (char)' гарантированно будет 1. –

6

Этот метод использует memset функцию «C», и очень быстро (избегает углеродно по-полукокса цикл).

const uint size = 65546; 
char* msg = new char[size]; 
memset(reinterpret_cast<void*>(msg), 0, size); 
+8

нет необходимости в актерском составе, неявный T * to void * разрешен в C++, только не неявный void * to T * –

+5

... не говоря уже о том, что правильный приведение здесь будет 'static_cast'. – avakar

+0

И 'std :: fill' намного лучше. Любой современный компилятор будет использовать 'memset', когда это возможно, и не использовать его в непоследовательности. – GManNickG

16

«Самый C++» способ сделать это - использовать std::fill.

std::fill(msg, msg + 65546, 0); 
+1

+1, (довольно) типичный и удобный для чтения. Althrough, я бы предпочел & msg [0], & msg [65546] (также я думаю, что 65536 - это предполагаемый размер =) –

8

, что это лучший способ сделать это в C++?

Потому что вы спросили об этом:

std::string msg(65546, 0); // all characters will be set to 0 

Или:

std::vector<char> msg(65546); // all characters will be initialized to 0 

Если вы работаете с функциями C, которые принимают символ * или сопзЬ символ *, то вы можете сделать:

some_c_function(&msg[0]); 

Вы также можете использовать метод c_str() на std :: stri ng, если он принимает const char * или data().

Преимущество этого подхода заключается в том, что вы можете делать все, что хотите, с динамическим распределением буфера символов, но более безопасно, гибко, а иногда и более эффективно (избегая необходимости перекомпоновки длины строки линейно, например). Лучше всего, вам не нужно освобождать выделенную память вручную, так как деструктор сделает это за вас.

+2

+1 для того, чтобы сделать шаг назад от вопроса и предложить, как это, вероятно, должно быть сделано. –

14

В отсутствие действительно хорошая причина, чтобы сделать иначе, я бы, вероятно, использовать:

std::vector<char> msg(65546, '\0'); 
+6

+1, поскольку пользователь попросил лучший способ C++. :-D – stinky472

1

Вы можете использовать цикл. но не забывайте, что последний символ должен быть нулевым символом!

char * msg = new char[65546]; 
for(int i=0;i<65545;i++) 
{ 
    msg[i]='0'; 
} 
msg[65545]='\0'; 
+0

Я уверен, что OP хотел, чтобы массив был инициализирован всеми нулями (иначе называемыми нулями) не для всех '' 0'' :-) –

0

C-как метод не может быть столь же привлекательным, как и другие решения этого вопроса, но добавил для полноты:

Вы можете инициализируются нулями, как это:

char msg[65536] = {0}; 

Или использовать нули необходимо учитывать следующее:

char msg[65536] = {'0' another 65535 of these separated by comma}; 

Но не пытайся его как not possible, поэтому используйте memset!

Во втором случае добавьте следующее после memset, если вы хотите использовать msg как строку.

msg[65536 - 1] = '\0' 

Ответы на вопросы this question также дают дополнительную информацию.

+0

@HJ: Отредактировано, спасибо. OP хотел ноль, если использовать [ASCII] (http://www.theasciicode.com.ar/ascii-printable-characters/number-zero-ascii-code-48.html) '0' - это то же самое, что и Chr (48)? –

+0

Слово «ноль» неоднозначно, когда вы говорите об символе, но оно * обычно * означает нуль, а не символ ASCII ''0''. Я считаю, что OP означал массив нулей, а не массив, полный нулевого символа, хотя бы потому, что последний вряд ли будет полезен. Но это не повредит вашему ответу, чтобы объяснить, как это сделать. –

+0

... кроме того, что я * думаю * ваш второй фрагмент кода будет содержать только один '' 0 '' в массив? Вы попробовали? –

Смежные вопросы