char * msg = new char[65546];
хотите инициализировать до 0 для всех них. Каков наилучший способ сделать это на C++?Как инициализировать массив символов?
char * msg = new char[65546];
хотите инициализировать до 0 для всех них. Каков наилучший способ сделать это на C++?Как инициализировать массив символов?
char * msg = new char[65546]();
Он известен как ценностной инициализации, и был введен в C++ 03. Если вам случится оказаться в ловушке в предыдущее десятилетие, вам нужно будет использовать std::fill()
(или memset()
, если вы хотите притвориться, что это C).
Обратите внимание, что это не будет работать ни для какого значения, кроме нуля. Я думаю, что C++ 0x предложит способ сделать это, но я немного отстаю от времени, поэтому я не могу комментировать это.
ОБНОВЛЕНИЕ: кажется, мои размышления о прошлом и будущем языка не совсем точны; см. комментарии для исправлений.
+1 для идеального решения :-). –
Это очень хорошо работает, поскольку 0 является интегральным значением по умолчанию для 'char'. –
@ Эрик, который не имеет ничего общего с ООП: S –
memset(msg, 0, 65546)
Помните '#include
Является ли sizeof (char) гарантией 1? Я никогда не видел, чтобы этого не было, но если бы это не было гарантировано стандартом, я бы использовал «memset (msg, 0,65546 * sizeof (char))», просто чтобы быть уверенным. –
@Paul: 'sizeof (char)' гарантированно будет 1. –
Этот метод использует memset функцию «C», и очень быстро (избегает углеродно по-полукокса цикл).
const uint size = 65546;
char* msg = new char[size];
memset(reinterpret_cast<void*>(msg), 0, size);
нет необходимости в актерском составе, неявный T * to void * разрешен в C++, только не неявный void * to T * –
... не говоря уже о том, что правильный приведение здесь будет 'static_cast'. – avakar
И 'std :: fill' намного лучше. Любой современный компилятор будет использовать 'memset', когда это возможно, и не использовать его в непоследовательности. – GManNickG
«Самый C++» способ сделать это - использовать std::fill
.
std::fill(msg, msg + 65546, 0);
+1, (довольно) типичный и удобный для чтения. Althrough, я бы предпочел & msg [0], & msg [65546] (также я думаю, что 65536 - это предполагаемый размер =) –
, что это лучший способ сделать это в 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().
Преимущество этого подхода заключается в том, что вы можете делать все, что хотите, с динамическим распределением буфера символов, но более безопасно, гибко, а иногда и более эффективно (избегая необходимости перекомпоновки длины строки линейно, например). Лучше всего, вам не нужно освобождать выделенную память вручную, так как деструктор сделает это за вас.
+1 для того, чтобы сделать шаг назад от вопроса и предложить, как это, вероятно, должно быть сделано. –
В отсутствие действительно хорошая причина, чтобы сделать иначе, я бы, вероятно, использовать:
std::vector<char> msg(65546, '\0');
+1, поскольку пользователь попросил лучший способ C++. :-D – stinky472
Вы можете использовать цикл. но не забывайте, что последний символ должен быть нулевым символом!
char * msg = new char[65546];
for(int i=0;i<65545;i++)
{
msg[i]='0';
}
msg[65545]='\0';
Я уверен, что OP хотел, чтобы массив был инициализирован всеми нулями (иначе называемыми нулями) не для всех '' 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 также дают дополнительную информацию.
@HJ: Отредактировано, спасибо. OP хотел ноль, если использовать [ASCII] (http://www.theasciicode.com.ar/ascii-printable-characters/number-zero-ascii-code-48.html) '0' - это то же самое, что и Chr (48)? –
Слово «ноль» неоднозначно, когда вы говорите об символе, но оно * обычно * означает нуль, а не символ ASCII ''0''. Я считаю, что OP означал массив нулей, а не массив, полный нулевого символа, хотя бы потому, что последний вряд ли будет полезен. Но это не повредит вашему ответу, чтобы объяснить, как это сделать. –
... кроме того, что я * думаю * ваш второй фрагмент кода будет содержать только один '' 0 '' в массив? Вы попробовали? –
Лучший способ - никогда не использовать 'new' вручную так. Используйте 'std :: vector'. – GManNickG
memset или calloc. – eemz