memset()函数用法及其作用
- memset()函数原型是:
- extern void *memset(void *buffer, int c, int count)
- //buffer:为指针或是数组,
- //c:是赋给buffer的值,
- //count:是buffer的长度.
这个函数在socket中多用于清空数组.如:原型是:
memset(buffer, 0, sizeof(buffer))
2.memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;
- char a[100];
- memset(a, '\0', sizeof(a));
3.memset可以方便的清空一个结构类型的变量或数组,如:
- struct sample_struct
- {
- char csName[16];
- int iSeq;
- int iType;
- };
对于变量:
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
- stTest.csName[0]='/0';
- stTest.iSeq=0;
- stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
- struct sample_struct TEST[10];
- // 则用
- memset(TEST,0,sizeof(struct sample_struct)*10);
4.将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作。用 法:
void *memset(void *s, char ch, unsigned n);
刚分配的内存空间,或者是被你用过的内存空间里面的数据是不固定的为了避免这些无用的数据给自己的程序带来影响,可以用memset把这些内存里面的数据置成某个数值一般情况下是置0,当然,如果你的程序不会受这些无用数据影响,就不用做这个工作了所谓“初始化”。
当然是指将你定义的变量或申请的空间赋予你所期望的值,例如语句
- int i=0; //就表明定义了一个变量i,并初始化为0;
- int j=5; //就表明定义了一个变量j,并初始化为5。
但是对于大块儿内存的分配,这种方法当然不行,例如
int arr[100];
定义了数组arr,包含100个元素,如果你写成int arr[100]=0;想将数组全部内容初始化为0,是不行的,连编译都不能通过。这种情况的初始化,有两种方法,一种是一个一个的初始化,如
for(int i=0;i<100;i++)arr[i]=0;
就完成了数组的初始化。
另一种方法,就是使用memset:一个语句就够了
memset(arr,0,sizeof(int)*100);
各参数解释如下:arr是数组的首地址,0就是要讲这些地址的内容赋值为0,sizeof(int)求出int类型的长度,乘以100就表示arr数组的整个长度。
当然,如果用malloc分配的内存,一般只能使用memset来初始化了,用第一种初始化方法明显不合适。例:
- char ch[10];
- memset(ch,0,8);
就是把数组ch前八项置为零,后面的不一定为零。
比如刚开始
ch[1]='z',ch[8]='a',ch[9]='b';
经过memset后,ch[1]为零了,而ch[8],ch[9]都不变.
5.区别
memset主要应用是初始化某个内存空间。
memcpy是用于copy源空间的数据到目的空间中。
strcpy用于字符串copy,遇到‘\0’,将结束。
6.另外
memest原型:
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,
- #include <iostream>
- #include <cstring>
- using namespace std;
- int main()
- {
- char a[5];
- memset(a,'1',5);
- for(int i = 0;i < 5;i++)
- cout<<a[i]<<" ";
- system("pause");
- return 0;
- }
而,如下程序想吧数组中的元素值设置成1,却是不可行的
- #include <iostream>
- #include <cstring>
- using namespace std;
- int main()
- {
- int a[5];
- memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的
- for(int i = 0;i < 5;i++)
- cout<<a[i]<<" ";
- system("pause");
- return 0;
- }
问题是:
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元素的赋值了。
memset()函数用法及其作用相关推荐
- c++ memset 语言_C++中memset函数用法详解
本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...
- memset()函数用法
1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组, c:是赋给buff ...
- memset函数用法百度
memset是计算机中C/C++语言函数.将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存 ...
- memset linux 头文件,C函数之memset()函数用法
1.功能:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针 2. 需要的头文件 o ...
- c语言memset函数用法(转)
功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 用 法: void *memset(void * ...
- c语言子函数作用是什么意思,C语言编译器中常见的函数用法以及作用详解
C语言的编译器中自带很多库函数,如果熟悉了,用起来操作起来都很方便,不仅能提高效率稳定性也是毋庸置疑的,毕竟都是世界级的大师写出来的.今天就来谈一谈,C语言自带的函数内存操作处理这一块 主要有:mem ...
- c语言memset函数用法,C语言memset函数使用方法详解
C语言memset函数使用方法详解 一.函数原形 void * memset(void*s, int ch,size_t n) 二.函数作用 将以s内存地址为首的连续n个字节的内容置成ch,一 ...
- malloc函数及memset函数用法详解
最近在力扣刷题时,发现普通的创建数组很容易引起编译器报错. 而使用到动态内存分配malloc()函数和初始化函数memset()可以避免这类问题的发生.本文将详细介绍一下两个函数的 malloc() ...
- 【C语言】详解 memset() 函数用法
1.memset 函数介绍 void * __cdecl memset(void *_Dst,int _Val,size_t _Size); 解释:复制字符 _Val(一个无符号字符)到参数 _Dst ...
最新文章
- 制作U盘启动LINUX安装(Ubuntu12.04)
- 跨计算机建立视图_计算机二级office
- P5290 [十二省联考2019]春节十二响
- ev10aq190a采集电路图_EV10AQ190A数模转换器
- Android的SQLite数据库增删查改(SimpleAdapter绑定ListView)
- celery配合rabbitmq任务队列实现任务的异步调度执行[celery redis]
- mysql存储emoji表情
- 树形dp贪吃的九头龙(vijos1523)
- Python 爬取表情包并保存在数据库中(以往的爬虫改进)
- WinRAR注册+去广告教程
- 软件测试面试题【2021模拟面试整理版(含答案)】
- ant design-Table中的分页实现(包括点击跳页,输入跳页,以及指定每页项目数)
- ubuntu使用Firefox无法播放视频
- iOS之Apple ID双重认证与两步验证的区别
- mysql修改校对集_关于MySQL字符集和校对集问题
- mybatis看这一篇就够了,简单全面一发入魂
- 制作WINDOWS图标
- html打飞机游戏代码,利用HTML5 Canvas实现打飞机游戏
- PHP 验证码图片无法正常显示
- 前馈神经网络FNN(原理及实现)