首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
memset函数
时间:
2015-03-12 22:31:51
阅读:
242
评论:
0
收藏:
0
[点我收藏+]
标签:
常见错误:
第一: 搞反了 ch 和 n 的位置.
一定要记住如果要把一个char a[20]清零,一定是 memset(a,0,20);而不是 memset(a,20,0);
第二: 过度使用memset,我想这些
程序
员可能有某种心理阴影,他们惧怕未经
初始化
的内存,所以他们会写出这样的代码:
这里的
memset
是多余的. 因为这块内存马上就被全部覆盖,清零没有意义.
另:以下情况并不多余,因某些
编译器
分配空间时,内存中默认值并不为0:
第三: 其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现
这里错误的
原因
是VC函数传参
过程
中的
指针
降级,导致
sizeof
(a),返回的是一个 something*指针类型大小的的
字节
数,如果是32位,就是4字节。
常见问题:
问:为何要用memset置零?memset(&Address,0,sizeof(Address));经常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。
答:1.如果不清空,可能会在测试当中出现野值。你做下面的试验看看结果()
这样写,有没有memset,输出都是一样
⒉其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个
试验
,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)
问:
如下demo是可以的,能把
数组
中的
元素
值都设置成字符1,
而,如下程序想把数组中的元素值设置成1,却是不可行的
问题是:
1,第一个程序为什么可以,而第二个不行?
因为第一个程序的数组a是
字符
型的,字符型占据内存大小是1Byte,而memset函数也是以
字节
为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。
2,不想要用for,或是while循环来初始化int a[5];能做到吗?(有没有一个像memset()这样的函数初始化)
如果用memset(a,1,20);(实际上与memset(a,1,5*sizeof(int))结果是一样的)就是对a指向的内存的20个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起是0000 0001,0000 0001,0000 0001,0000 0001,转化成十六进制就是0x01010101,就等于16843009,就完成了对一个INT元素的赋值了。
程序范例:
输出结果:
Microsoft Visual C++
6.0
也不一定就是把内容全部设置为ch指定的ASCⅡ值,而且该处的ch可为int或者其他类型,并不一定要是char类型。例如下面这样:
输出的结果就是:
后面的表大小的参数是以
字节
为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()。
要注意的是,memset是对
字节
进行操作,所以上述程序如果改为
输出的结果就是:
为什么呢?
因为memset是以
字节
为单位就是对array指向的内存的4个字节进行赋值,
字节
,合一起就是
就等于16843009,就完成了对一个INT元素的赋值了。所以用memset对非字符型
数组
赋初值是不可取的!
例如有一个
结构体
Some x,可以这样清零:
如果是一个
结构体
的
数组
Some x[10],可以这样:
memset函数详细说明
1。void *memset(void *s,int c,
size_t
n)
总的作用:将已开辟内存空间 s 的首 n 个
字节
的值设为值 c。
2。例子
【以上例子出现内存访问冲突应该是因为s被当做
常量
放入程序
存储空间
,如果修改为 char s[]="Golden Global View";则没有问题了。】
【应该是没有问题的,字符串
指针
一样可以,并不是只读内存,可以正常运行】
【此实例可以正常编译运行,并不像楼主说的需要char s[]】
【memset(s,‘G‘,6)这样是存在内存访问冲突的,因为s为常量字符串,不能修改的】
3。memset() 函数常用于内存空间初始化。如:
4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘memset(a,‘\0‘,sizeof(a));
5。补充:一点技巧
memset可以方便的清空一个结构类型的
变量
或
数组
。
如:
对于变量
一般情况下,清空stTest的方法:
用memset就非常方便:
如果是数组:
则
另外:
如果
结构体
中有
数组
的话还是需要对数组单独进行初始化处理的。
memset函数
标签:
原文地址:http://www.cnblogs.com/yedushusheng/p/4333813.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!