Поскольку вопрос постоянно меняется, я определяю:
1: memset( buffer, '\0', sizeof(buffer) );
2a: memset( buffer, '\0', sizeof(char*) * ARRAY_LENGTH );
2b: memset( buffer, '\0', sizeof(char) * ARRAY_LENGTH );
3: memset( buffer, '\0', ARRAY_LENGTH );
Если вопрос состоит просто в том, «как правильно вызвать memset
», а не в том, «как лучше всего обнулить этот массив», то правильным будет либо 2b, либо 3. 1 и 2а неверны.
У вас может быть война стилей из-за 2b против 3: включать ли sizeof(char)
или нет - некоторые люди опускают его, потому что он избыточен (я обычно так делаю), другие люди вставляют его, чтобы создать своего рода согласованность с той же настройкой кода. массив int
. То есть они всегда умножают размер на количество элементов, даже если знают, что размер равен 1. Один из возможных выводов состоит в том, что «самый безопасный» способ memset для массива, на который указывает buffer
, это:
std::memset(buffer, 0, sizeof(*buffer) * ARRAY_LENGTH);
Этот код остается правильным, если изменяется тип буфера, при условии, конечно, что он по-прежнему содержит ARRAY_LENGTH
элементов любого типа и при условии, что все биты-ноль остаются правильным начальным значением.
Другой вариант, любимый программистами "C++ не C", это:
/* never mind how buffer is allocated */
std::fill(buffer, buffer + ARRAY_LENGTH, 0);
Если вам не все равно, вы можете сами проверить, оптимизирует ли ваш компилятор это для того же кода, для которого он оптимизирует эквивалентный вызов std::memset
.
char *buffer = new char [ARRAY_LENGTH]();
изящно, но на практике почти бесполезно в C++, потому что вы почти никогда не выделяете массив с new
в первую очередь.
std::string buffer(ARRAY_LENGTH, 0);
представляет особый способ управления буфером, который может быть или не быть тем, что вам нужно, но часто так и есть. В некоторых случаях можно многое сказать о char buffer[ARRAY_LENGTH] = {0};
.
person
Steve Jessop
schedule
17.10.2012
sizeof(char)
, что всегда1
. - person hmjd   schedule 17.10.2012memset(buffer, '\0', sizeof(char) * ARRAY_LENGTH);
. Однако синтаксис, указанный Лучианом, лучше. - person Lundin   schedule 17.10.2012new[]
в C++, используйте соответствующий контейнер. - person GManNickG   schedule 17.10.2012