memset
memset要慎用!!!!!
memset要慎用!!!!!
memset要慎用!!!!!
重要的事情说三遍
/*
2019.04.03更新
把更新写在最前面叭,因为我真的犯了愚蠢至极的错误
评论里也指出了很多错误,需要改进
关于memset
只能将其用来初始化,而不是将其拿来赋具体的值
一般来说用0或-1初始化,所以memset还是要慎用的
贴上评论区的解释
谢谢大家的批评指正,我我我我我我一定会更加努力的!!
*/
今天写了道题,答案错的离谱至极
明明答案是个位数,跑出来的确实十几位数????
第一反应,数组初始化错误
源代码如下
memset (memo, 1, sizeof(memo));
可是我不是memset了么?????
算了,我用for循环初始好了
for (int i(1); i <= n; ++i)
for (int j(1); j <= m; ++j)
memo[i][j] = 1;
然后我很愉快地通过了样例,并AC了此题
我想了半天,想起来某某某曾经说过,memset要慎用,一般只用来清零,或者赋极大值,赋其他的值容易出错
然后我就亲测了一下
清零
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int a[5][5];
for (int i(0); i <= 4; ++i)
for (int j(0); j <= 4; ++j)
a[i][j] = 10;
memset(a, 0, sizeof(a));
for (int i(0); i <= 4; ++i)
{
for (int j(0); j <= 4; ++j)
printf ("%d ", a[i][j]);
printf ("\n");
}
return 0;
}
没有问题
初始化为1
memset (a, 1, sizeof(a));
什么???? 16843009是什么鬼????这好像就是我那个离谱的答案
初始化为-1也是同样的结果显示的是16843009
那我随便取个数好了,初始化为5
memset(a, 5, sizeof(a));
emmmmmm
最后试了一下极大值
memset (a, 11234567, sizeof(a));
emmmmmm
亲测的结果就是除了清零以外,其他都出错了,出错了,出错了!!!!!
其实我还亲测了一遍一维数组,也是0,1,5,11234567
结果一样,除了清零以外都出了错,而且数字都是一样的
因为我实在是太懒了,也很饿,想吃东西了,所以关于亲测一维数组的代码和图片就一一上传了,具体memset函数的内部结构研究透之后会更新
目前而言建议memset仅用于赋值为0或-1,其余建议用for循环完成,速度不会相差太多
嗯,大概就是这样吧
纪念一下第一篇博客
以后会不定时地写一些博客
相关阅读
使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨
如果以这样的方式声明数组int a[256]={0};则数组内全部数字自动初始化为0,即一开始数组内所有元素的值为0如果这样声明int a[256];
参考资料: https://blog.csdn.net/yang_zongjun/article/details/39025581有很多博客的确介绍了怎么具体操作。但是我有些不理解它
功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请
使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨