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

Posted

技术标签:

【中文标题】为啥 memset() 放在循环体内时不能正常工作?【英文标题】:Why memset() does not work properly when placed inside a loop body?为什么 memset() 放在循环体内时不能正常工作? 【发布时间】:2011-04-18 16:51:31 【问题描述】:

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

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

那么数组不会被重置为全0。对于我使用的这个程序:

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

改为。

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

【问题讨论】:

sum 变量类型是什么? 您确认没有收到任何编译器警告吗? 【参考方案1】:

您实际上是在将 sum 的大小写入前 0 个字节。 你应该改用memset(sum,0,sizeof(sum))

(换句话说,参数是 targetdatalength,而您提供的数据和长度顺序错误。)

【讨论】:

糟糕!猜猜我已经很久没有做 C 编程了……毕竟向量是如此方便,以至于一个人可能会忘记他多年前所学的东西。非常感谢! @Ziyao:如果这篇文章回答了你的问题,请考虑点击左边的绿色复选标记接受它。 你可能想看看 Mark B 的答案,因为它是一个更 C++ 风格的问题解决方案。 @John Dibling:谢谢!我刚做了。【参考方案2】:

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

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

memcpy 不起作用的原因是,正如其他答案所述,您交换了第二个和第三个参数。

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

【讨论】:

哇,这是我必须记住的东西。 fill_n 可以在数组上工作,或者这个函数只能在向量/双端队列/等上工作吗?谢谢你的回答! @Ziyao:长话短说,这不仅仅适用于 STL 集合类型。 它甚至适用于 iostreams,例如在std::coutstd::ofstream 上,通过std::ostream_iterator&lt;T&gt;【参考方案3】:
memset(sum,sizeof(sum),0);

错了。

我想你想写:

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

memset 函数的签名是这样的:

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

它的description 是:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

函数memset的语法是:

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

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

所以你需要:

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

【讨论】:

以上是关于为啥 memset() 放在循环体内时不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 pygame 应用程序循环不能正常工作? [复制]

为啥我们不能循环遍历`...`?

Java:为啥我不能在 main 之外调用这个方法? [关闭]

在带有其他命令的块内时退出 /b 无法正常工作

为啥我不能选择侧面菜单中的第一项?

当我们将命令放在美元符号和括号内时,shell 中的含义是啥: $(command)