Почему memset() не работает должным образом, когда находится внутри тела цикла?
Вчера я запрограммировал небольшой фрагмент кода на C++, который содержит цикл и массив. В программе мне нужно сбрасывать массив каждый раз, когда цикл начинается заново. Однако, если я использую
memset(sum,sizeof(sum),0);
Тогда массив не будет сброшен на все 0. Для этой программы я использовал:
for (i=0;i<sizeof(sum)/sizeof(int);i++) sum[i]=0;
вместо.
Тем не менее, я думаю, что цикл не так понятен, как функция, и для него требуется дополнительная переменная, не говоря уже о том, что она в миллион раз не охлаждает, чем волшебство функции memset(). Ребята, не могли бы вы объяснить мне это?
5 ответов
Вы на самом деле записываете размер суммы в 0 первых байтов. Вы должны делать memset(sum,0,sizeof(sum))
вместо.
(Другими словами, аргументы являются целью, данными и длиной, и вы предоставили данные и длину в неправильном порядке.)
Это C++, так что делайте это C++ способом fill_n
,
std::fill_n(&sum[0], sizeof(sum) / sizeof(sum[0]), 0);
Причина ваша memcpy
не сработало, потому что, как отмечалось в других ответах, вы поменяли местами второй и третий аргументы.
РЕДАКТИРОВАТЬ: fill
а также fill_n
будет работать со всем, что обеспечивает или может рассматриваться как выходной итератор. Для стандартных контейнеров, таких как vector
Вы можете предварительно определить размер контейнера или использовать back_inserter
в то время как для массивов вы можете использовать форму, которую я указал.
memset(sum,sizeof(sum),0);
Неправильно.
Я думаю, что вы хотели написать:
memset(sum,0, sizeof(sum));
Подпись memset
функция это:
void * memset ( void * ptr, int value, size_t num );
И его описание:
Устанавливает первые n байтов блока памяти, указанного указателем ptr, в указанное значение (интерпретируется как символ без знака).
Я думаю, что у вас есть параметры в неправильном порядке.
Согласно cplusplus.com, параметр размера должен быть последним:
void * memset ( void * ptr, int value, size_t num );
Синтаксис функции memset:
void *memset(void *s, int c, size_t n);
Функция memset() заполняет первые n байтов области памяти, на которую указывает s, постоянным байтом c.
Итак, вам нужно:
memset (sum, 0, sizeof(sum));