memest原型 (please type "man memset" in your shell) 

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

memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。

常见的三种错误

第一: 搞反了c 和 n的位置.

一定要记住 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20) 
而不是 memset(a, 20,  0)

第二: 过度使用memset, 我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码:

char buffer[20];

memset(buffer, 0, sizeof(char)*20); 
strcpy(buffer, "123");

这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义.

第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现

int some_func(struct something *a){ 
 … 
 … 
 memset(a, 0, sizeof(a)); 
 … 
}

:为何要用memset置零?memset( &Address, 0, sizeof(Address));经常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。

答: 1.如果不清空,可能会在测试当中出现野值。 你做下面的试验看看结果()

char buf[5];

CString str,str1; //memset(buf,0,sizeof(buf));

for(int i = 0;i<5;i++)

{ str.Format(“%d “,buf[i]); str1 +=str ; }

TRACE(“%s\r\n“,str1)

2.其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)

问:

如下demo是可以的,能把数组中的元素值都设置成字符1

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int main()
 5 {
 6     char a[5];
 7     memset(a,'1',5);
 8     for(int i = 0;i < 5;i++)
 9       cout<<a[i]<<"  ";
10     system("pause");
11     return 0;
12 }

而,如下程序想吧数组中的元素值设置成1,却是不可行的

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int main()
 5 {
 6     int a[5];
 7     memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的
 8     for(int i = 0;i < 5;i++)
 9       cout<<a[i]<<"  ";
10     system("pause");
11     return 0;
12 }

  

问题是:

1,第一个程序为什么可以,而第二个不行,
2,不想要用for,或是while循环来初始化int a[5];能做到吗?(有没有一个像memset()这样的函数初始化)

答:

1.因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?

2.如果用memset(a,1,20);
就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是1000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。

转载于:https://www.cnblogs.com/iamxiaoyubei/p/5064821.html

memest函数用法说明(转自Lee.Kevin)相关推荐

  1. format函数python的顺序_[转载] Python中format函数用法

    Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...

  2. python中sleep函数用法_python中sleep函数用法实例分析

    本文实例讲述了python中sleep函数用法.分享给大家供大家参考.具体如下: Python中的sleep用来暂停线程执行,单位为秒 #------------------------------- ...

  3. Python中format函数用法

    Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...

  4. python中sleep的用法_python中sleep函数用法实例分析

    本文实例讲述了python中sleep函数用法.分享给大家供大家参考.具体如下: Python中的sleep用来暂停线程执行,单位为秒 #------------------------------- ...

  5. [转载] Python中format函数用法

    参考链接: Python | format Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1. ...

  6. 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法

    目录 高阶函数用法 作为值的函数 匿名函数 柯里化(多参数列表) 闭包 高阶函数用法 Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是"头等公民",它和Int. ...

  7. php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?

    foreach的使用方法小编不是很明确,分享达人指教一下.foreach (array_expressforeach($array as $key) { if(xxxx) { break; //bre ...

  8. linux中awk下 gsub函数用法

    gsub函数则使得在所有正则表达式被匹配的时候都发生替换 gsub(regular expression, subsitution string, target string);简称 gsub(r,s ...

  9. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

最新文章

  1. 《中国人工智能学会通讯》——5.15 案例速览
  2. 你的 webpack 也需要休息,让你的 webpack 拒绝 996ICU
  3. css3让元素自适应高度
  4. 【控制】《自动控制原理》胡寿松老师-第7章-线性离散系统的分析与校正
  5. Thymeleaaf中设置属性值实现动态控制select是否可选
  6. TCP、UDP、IP 协议分析
  7. 从动力学角度看优化算法:一个更整体的视角
  8. 数据库-优化-每个字段的说明
  9. spring整合mybatis基于xml配置
  10. php保存附件到指定服务器,如何在PHP中将电子邮件附件保存到服务器?
  11. 被问到一个简单的脚本后
  12. 设置gradle远程仓库_有幸得到Alibaba内部Gradle实战笔记,趁双节来狂补
  13. PHP7语法知识(三):时间与日期、表单、类与对象、正则表达式、错误异常处理、图像处理...
  14. PSP金手指CMF_r21d修改版安装方法
  15. 如何激发孩子的想象力_如何培养孩子想象力
  16. 初学ASP.Net时在论坛收藏收集的一些资料备忘
  17. oracle12兼容ojdbc6,oracle ojdbc6 使用 报错
  18. iperf3网络测试工具下载网址
  19. 日常开发中,String类中常用的方法
  20. 一文告诉您游戏开发需要学什么

热门文章

  1. CTFshow 信息收集 web20
  2. sdut 1488 连通分量的个数(并查集)
  3. 怎么在Caffe中配置每一个层的结构
  4. findContours函数
  5. Share memory中bank conflict问题
  6. 干净卸载mysql (注册表)
  7. VC2005中依然没有Refactoring和Code Expansion.
  8. support library目录解释说明内容
  9. ZOJ18th省赛 Lucky 7
  10. java基本输入类型数据System.out.println()或System.out.print()