昨天我在C ++中编写了一个包含循环和数组的小片段代码。在程序中,我需要在每次循环重启时重置数组。但是,如果我使用
memset(sum,sizeof(sum),0);
然后数组不会重置为全0。对于这个程序我用过:
for (i=0;i<sizeof(sum)/sizeof(int);i++) sum[i]=0;
代替。
但是,我认为循环并不像函数那样清晰,它需要一个额外的变量,更不用说这比memset()函数的魔法要宽一百万次了。你们能帮我们这个吗?
答案 0 :(得分:11)
您实际上是将sum的大小写入0个第一个字节。
您应该改为memset(sum,0,sizeof(sum))
。
(换句话说,参数是目标,数据和长度,并且您提供的数据和长度顺序错误。)< / p>
答案 1 :(得分:7)
这是C ++,所以使用fill_n
进行C ++方式。
std::fill_n(&sum[0], sizeof(sum) / sizeof(sum[0]), 0);
memcpy
无法正常工作的原因是,正如其他答案中所述,您交换了第二个和第三个参数。
编辑:fill
和fill_n
将适用于提供或可被视为输出迭代器的任何内容。对于像vector
这样的标准容器,您可以预先设置容器大小或使用back_inserter
,而对于数组,您可以使用我指定的格式。
答案 2 :(得分:4)
memset(sum,sizeof(sum),0);
错误。
我想你想写:
memset(sum,0, sizeof(sum));
memset
功能的签名是这样的:
void * memset ( void * ptr, int value, size_t num );
它的description是:
将ptr指向的内存块的第一个num字节设置为指定值(解释为unsigned char)。
答案 3 :(得分:2)
答案 4 :(得分:1)
函数 memset 的语法是:
void *memset(void *s, int c, size_t n);
memset()函数用常量字节c填充s指向的内存区域的前n个字节。
所以你需要:
memset (sum, 0, sizeof(sum));