当前位置:网站首页>辨析内存函数memset、memcmp、memmove以及memcpy
辨析内存函数memset、memcmp、memmove以及memcpy
2022-08-02 00:06:00 【BSP初级小学僧】
博客主页:https://blog.csdn.net/weixin_46094737?type=blog
欢迎评论留言 如有错误敬请指正!
本文由小学生廉原创,首发于 CSDN
未来很长,值得我们全力奔赴更美好的生活!
1、memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。
char a[5];
memset(a,'a',5);
puts(a);
- a指向要填充的内存块。
- 'a'是要被设置的值。
- 5是要被设置该值的字符数。
运行结果:
注意事项:
memset函数是按照字节对内存块进行初始化,所以不能用它将int数组出初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
其实c的实际范围应该在0~255,因为memset函数只能取c的后八位给所输入范围的每个字节。也就是说无论c多大只有后八位二进制是有效的。
memset函数在初始化处理时非常方便,但也有其局限性,比如要注意初始化数值,要注意字节数等等。当然,直接选择用for循环或while循环来进行初始化也是可以的,只不过memset更快捷一些。
2、memcmp是比较内存区域buf1和buf2的前count个字节,该函数是按字节比较的。
基本原型:int memcmp(const void *buf1, const void *buf2, unsigned int count);
主要功能:比较内存区域buf1和buf2的前count个字节。
返回值:
当buf1<buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
//a[0] 10 00 00 00
//a[1] 20 00 00 00
int a[2]={10,20};
int b[2]={10,11};
//a[0] 10 00 00 00
//a[1] 11 00 00 00
int ret=-1;
ret=memcmp(a,b,5);//内存比较函数,相同为0,不同为1(字节!!!!)
printf("ret=%d",ret);
运行结果:ret=1
说明:该函数是按字节比较的。
例如:
s1,s2为字符串时候memcmp(s1,s2,1)就是比较s1和s2的第一个字节的ascII码值;
memcmp(s1,s2,n)就是比较s1和s2的前n个字节的ascII码值,如:
char *s1="abc";
char *s2="acd";
int r=memcmp(s1,s2,3);
就是比较s1和s2的前3个字节,第一个字节相等,第二个字节比较中大小已经确定,不必继续比较第三字节了所以r=-1.
3、memmove内存拷贝函数
memmove内存拷贝函数,功能是拷贝n个字节到目标地址,目标内存和源地址内存可以重叠。
另外一个内存拷贝函数memcpy,不可以内存重叠。
memmove不是一个安全的函数,因此要注意拷贝时,有越界的产生。一个长度n的数组,使用memmove向后移一位,最多能拷贝n-2个字节。
int a[10]={11,12,13,14,15,16,17,18,19,20};
memmove(a,a+5,12);
puts(a);
运行结果:
4、memcpy内存复制函数
原理:
memcpy函数是C语言中的一个用于内存复制的函数,声明在 string.h 中。其原型是:
void test_01(void)//测试字符串,但是memcpy复制还是一个一个字符去复制
{
char str01[]="hello,ni,hao";
char str02[20];
memcpy(str02,str01,12);
print_c(str02,12);
}
运行结果:
p[0]=h p[1]=e p[2]=l p[3]=l p[4]=o p[5]=, p[6]=n p[7]=i p[8]=, p[9]=h p[10]=a p[11]=o
作用是:以source指向的地址为起点,将连续的n个字节数据,复制到以destin指向的地址为起点的内存中。
函数有三个参数,第一个是目标地址,第二个是源地址,第三个是数据长度。
使用memcpy函数时,需要注意:
- 数据长度(第三个参数)的单位是字节(1byte = 8bit)。
- 注意该函数有一个返回值,类型是void*,是一个指向destin的指针。
memcpy函数复制的数据长度
使用memcpy函数时,特别要注意数据长度。如果复制的数据类型是char,那么数据长度就等于元素的个数。而如果数据类型是其他(如int, double, 自定义结构体等),就要特别注意数据长度的值。
好的习惯是,无论拷贝何种数据类型,都用 n * sizeof(type_name)
的写法。
边栏推荐
- JSP how to obtain the path information in the request object?
- 路由策略
- ROS 动态参数
- 基于编码策略的电网假数据注入攻击检测
- Don't know about SynchronousQueue?So ArrayBlockingQueue and LinkedBlockingQueue don't and don't know?
- PHP从txt文件中读取数据的方法
- 不就是个TCC分布式事务,有那么难吗?
- Short video SEO optimization tutorial Self-media SEO optimization skills and methods
- 控制电机的几种控制电路原理图
- Collection of NFT tools
猜你喜欢
An interesting project--Folder comparison tool (1)
当奈飞的NFT忘记了Web2的业务安全
Collection of NFT tools
When Netflix's NFTs Forget Web2 Business Security
零基础如何学习单片机,一位入门者的进阶路径,可参考
不就是个TCC分布式事务,有那么难吗?
Unknown CMake command “add_action_files“
Interview high-frequency test questions solution - stack push and pop sequence, effective parentheses, reverse Polish expression evaluation
Quick solution for infix to suffix and prefix expressions
Task execution control in Ansible
随机推荐
基于相关性变量筛选偏最小二乘回归的多维相关时间序列建模方法
Arduino Basic Syntax
【无标题】
bgp aggregation reflector federation experiment
Collection of NFT tools
TCL:在Quartus中使用tcl脚本语言进行管脚约束
[Three sons] C language implements simple three sons
JSP out.println()方法具有什么功能呢?
磁盘与文件系统管理
How to solve the error when mysql8 installs make
Is TCP reliable?Why?
[头条]笔试题——最小栈
nodeJs--各种路径
IO stream basics
解析正则表达式的底层实现原理
以交易为生是一种什么体验?
How to design a circular queue?Come and learn~
Short video seo search optimization main content
07-SDRAM :FIFO控制模块
回顾历史5次经济衰退时期:这一次可能会有何不同?