必威体育Betway必威体育官网
当前位置:首页 > IT技术

memset真的要慎用!!!!!

时间:2019-10-09 02:44:24来源:IT技术作者:seo实验室小编阅读:60次「手机版」
 

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++ 中 ZeroMemory、memset 危险需慎用

使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨

memset 函数原来是这样的

如果以这样的方式声明数组int a[256]={0};则数组内全部数字自动初始化为0,即一开始数组内所有元素的值为0如果这样声明int a[256];

memset的用法

参考资料: https://blog.csdn.net/yang_zongjun/article/details/39025581有很多博客的确介绍了怎么具体操作。但是我有些不理解它

memset函数

功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请

C++ 中 ZeroMemory、memset 危险需慎用

使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨

分享到:

栏目导航

推荐阅读

热门阅读