为什么memset()放在循环体内时不能正常工作?

时间:2011-04-18 16:51:31

标签: c++ c arrays memset

昨天我在C ++中编写了一个包含循环和数组的小片段代码。在程序中,我需要在每次循环重启时重置数组。但是,如果我使用

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

然后数组不会重置为全0。对于这个程序我用过:

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

代替。

但是,我认为循环并不像函数那样清晰,它需要一个额外的变量,更不用说这比memset()函数的魔法要宽一百万次了。你们能帮我们这个吗?

5 个答案:

答案 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无法正常工作的原因是,正如其他答案中所述,您交换了第二个和第三个参数。

编辑:fillfill_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)

我认为您的参数顺序错误。

根据cplusplus.com,size参数应为last:

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

答案 4 :(得分:1)

函数 memset 的语法是:

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

memset()函数用常量字节c填充s指向的内存区域的前n个字节。

所以你需要:

memset (sum, 0, sizeof(sum));
相关问题