为啥 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))
。
(换句话说,参数是 target、data 和 length,而您提供的数据和长度顺序错误。)
【讨论】:
糟糕!猜猜我已经很久没有做 C 编程了……毕竟向量是如此方便,以至于一个人可能会忘记他多年前所学的东西。非常感谢! @Ziyao:如果这篇文章回答了你的问题,请考虑点击左边的绿色复选标记接受它。 你可能想看看 Mark B 的答案,因为它是一个更 C++ 风格的问题解决方案。 @John Dibling:谢谢!我刚做了。【参考方案2】:这是 C++,所以用 C++ 方式使用fill_n
。
std::fill_n(&sum[0], sizeof(sum) / sizeof(sum[0]), 0);
memcpy
不起作用的原因是,正如其他答案所述,您交换了第二个和第三个参数。
编辑:fill
和 fill_n
将适用于任何提供或可以被视为输出迭代器的东西。对于像vector
这样的标准容器,您可以预先调整容器大小或使用back_inserter
,而对于数组,您可以使用我指定的形式。
【讨论】:
哇,这是我必须记住的东西。 fill_n 可以在数组上工作,或者这个函数只能在向量/双端队列/等上工作吗?谢谢你的回答! @Ziyao:长话短说,这不仅仅适用于 STL 集合类型。 它甚至适用于 iostreams,例如在std::cout
和std::ofstream
上,通过std::ostream_iterator<T>
【参考方案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 应用程序循环不能正常工作? [复制]