4

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

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

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

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

反而。

但是,我认为循环不如函数清晰,它需要一个额外的变量,更不用说这比 memset() 函数的魔法要酷一百万倍。各位大神能不能给我解惑一下?

4

5 回答 5

11

您实际上是将 sum 的大小写入第 0 个字节。你应该这样做memset(sum,0,sizeof(sum))

(换句话说,参数是targetdatalength并且您以错误的顺序提供了 data 和 length 。)

于 2011-04-18T16:53:59.107 回答
7

这是 C++,所以用 C++ 方式使用fill_n.

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

memcpy没有工作的原因是,如其他答案所述,你交换了第二个和第三个参数。

编辑:fill并且fill_n可以处理任何提供或可以被视为输出迭代器的东西。对于像您这样的标准容器,vector您可以预先调整容器的大小或使用back_inserter数组,而对于数组,您可以使用我指定的形式。

于 2011-04-18T16:57:11.693 回答
4
memset(sum,sizeof(sum),0);

错误的。

我想你想写:

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

函数的签名memset是这样的:

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

它的描述是:

将 ptr 指向的内存块的前 num 字节设置为指定值(解释为无符号字符)。

于 2011-04-18T16:54:01.017 回答
2

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

根据cplusplus.com, size 参数应该是最后一个:

void * memset ( void * ptr, int value, size_t num );
于 2011-04-18T16:54:50.073 回答
1

函数memset的语法是:

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

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

所以你需要:

memset (sum, 0, sizeof(sum));
于 2011-04-18T16:57:51.170 回答