关于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。 所以并不能用。
最新文章
- git操作的常用命令
- jquery 通过ajax FormData 对象上传附件
- 求第N个质数算法
- java enum类
- 搭建spring+mybatis+struts2环境的配置文件
- Memcached 搭建过程
- 面试前的准备---C#知识点回顾----05
- hdu1520 (树形dp)
- PRJ: Split a nodes-map into some triangles
- 再谈KMP
- Go笔记-流程控制
- 设计模式——抽象工厂模式(C++实现)
- centos 系统时间的同步
- 修复android 5.0 Xutils的框架问题retry error, curr request is null
- 从零开始学spring cloud(一) -------- spring cloud 简介
- react在router中传递数据的2种方法
- 【iCore1S 双核心板_FPGA】例程十一:Modelsim仿真实验
- :模板方法模式:Beverage
- 使用zabbix-java-gateway可以通过该网关来监听多个JVM
- Linux上查找