辨析内存函数memset、memcmp、memmove以及memcpy

博客主页: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)的写法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不掉头发的程序猿_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值