Почему memset () не работает должным образом, когда находится внутри тела цикла? - PullRequest
4 голосов
/ 18 апреля 2011

Вчера я запрограммировал небольшой фрагмент кода на C ++, который содержит цикл и массив. В программе мне нужно сбрасывать массив каждый раз, когда цикл начинается заново. Однако, если я использую

memset(sum,sizeof(sum),0);

Тогда массив не будет сброшен на все 0. Для этой программы я использовал:

for (i=0;i<sizeof(sum)/sizeof(int);i++) sum[i]=0;

вместо.

Тем не менее, я думаю, что цикл не так понятен, как функция, и для него требуется дополнительная переменная, не говоря уже о том, что она в миллион раз не охлаждает, чем волшебство функции memset (). Не могли бы вы, ребята, просветить меня об этом?

Ответы [ 5 ]

11 голосов
/ 18 апреля 2011

Вы на самом деле записываете размер суммы в 0 первых байтов. Вы должны делать memset(sum,0,sizeof(sum)) вместо.

(Другими словами, аргументы: target , data и length , и вы указали данные и длину в неправильном порядке.)

7 голосов
/ 18 апреля 2011

Это C ++, так что делайте это C ++ с fill_n.

std::fill_n(&sum[0], sizeof(sum) / sizeof(sum[0]), 0);

Причина, по которой ваш memcpy не сработал, заключается в том, что, как отмечалось в других ответах, вы поменяли второй и третий аргументы.

EDIT: fill и fill_n будут работать на всем, что обеспечивает или может рассматриваться как выходной итератор. Для стандартных контейнеров, таких как vector, вы можете предварительно задать размер контейнера или использовать back_inserter, в то время как для массивов вы можете использовать указанную мной форму.

4 голосов
/ 18 апреля 2011
memset(sum,sizeof(sum),0);

Неверно.

Я думаю, что вы хотели написать:

memset(sum,0, sizeof(sum));

Сигнатура функции memset такова:

void * memset ( void * ptr, int value, size_t num );

И description is:

Устанавливает первые num байтов блока памяти, на которые указывает ptr, указанное значение (интерпретируемое как символ без знака).

2 голосов
/ 18 апреля 2011

Я думаю, у вас параметры в неправильном порядке.

Согласно cplusplus.com , параметр размера должен быть последним:

void * memset ( void * ptr, int value, size_t num );
1 голос
/ 18 апреля 2011

Синтаксис функции memset :

void *memset(void *s, int c, size_t n);

Функция memset () заполняет первые n байтов области памяти, на которые указывает s, постоянным байтом c.

Итак, вам нужно:

memset (sum, 0, sizeof(sum));
...