Почему 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));
Другие вопросы по тегам