关于memset的几个易错点

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

作用:将s中当前位置后面的n个字节用 ch 替换并返回 s 

注意这里是“字节”而非单位长度,memset不会考虑各个类型的单位长度,只是处理字节。所以使用的时候应该用如下的格式:

memset(a,b,n*sizeof(int));//这里以Int为例。

-----------------------------------

同样是这个问题,我在一次想要给一个二维数组赋初值INT_MAX,写了这样的语句:

memset(mi,0x3f,sizeof(mi));

但是得到的结果却一直是-1,这是因为忽略了memset只是给字节赋值而非给单位赋值!INT_MAX是int中的最大值,但Int是占用4个字节的!用Int的最大值给字节赋值显然不合适。

 常用的几个正确的memset初始化方案有:

memset(mp,0,sizeof mp):  使mp数组里的所有值变为0x00000000 ,而0x00000000 = 0,所以mp数组里的所有值就变为了0。
memset(mp,0x3f3f3f3f,sizeof mp):0x3f3f3f3f = 1061109567 为10^9。 而且使用这个数字直接用memset函数就行了,不用循环初始化数组,不然真的很烦。(不是Int的最大值,但也已经是一个比较大的数了,大多数情况下可以了)
memset(mp,-1,sizeof mp):会使mp中每个元素的值为-1的原因如下:
int类型的整数-1在32位的计算机中表示为 11111111    11111111   11111111   11111111
memset将void *memset(void *s, int ch, size_t n)中的ch强制转换为unsigned char,
也就是变成11111111
最终执行完memset函数后,temp对应的内存每一字节都被赋值为11111111
也就是说temp的任意一个元素都为11111111    11111111   11111111   11111111
恰好为-1。

---------------------
作者:Mr_Treeeee
来源:CSDN
原文:https://blog.csdn.net/Mr_Treeeee/article/details/70540307
版权声明:本文为博主原创文章,转载请附上博文链接!

同样的错误方案有:

memset(mp,1,sizeof mp):  变量被初始化成了0x01010101 = 16843009 , 而非1。 所以并不能用。

 

posted @ 2019-06-29 00:10  别再闹了  阅读(1341)  评论(0编辑  收藏  举报