memcpy和memmove联系和区别

目录

一、介绍

二、函数的声明

三、拷贝的情况

四、模拟实现


一、介绍

        memcpymemmove和我们所知道的strcpystrncpy不同,前者是是适用于任何类型的,后者是仅适用于字符串的拷贝。而且strcpy是以‘\0’为结束条件,memcpymemmove是以参数num来控制。

二、函数的声明

   (1) void*  memcpy ( void * destination, const void * source, size_t num );

   (2) void * memmove ( void * destination, const void * source, size_t num );

1、memcpy是将源source所指向的num个字节的值拷贝到目标destination所指向的内存中。

2、memmove与memcpy的功能基本一致,不同点在于当source指向的空间与destination指向的空间重叠时候,使用memcpy可能会出现问题,而memmove能正确处理。

三、拷贝的情况

情况1️⃣:source与destination所指向的内存完全不重叠

 情况2️⃣:有重叠区域,并且destination小于source

 情况3️⃣:有重叠区域,并且source大于destination

四、模拟实现

1、memcpy

void* MyMemcpy(void* dest,const void* src,size_t num)
{
     assert(dest&&src);
     char* dest_tmp=(char*)dest;//目标字符串
     const char* src_tmp=(const char*)src;//源字符串

     while(num--)
     {
         *dest_tmp++= *src_tmp++;
     }
     return dest;返回目标字符串首地址
}

2、memmove

void* my_memmove(void* des, const void* src, size_t num)
{
	assert(des && src);
	void* ret = des;
	char* des_tmp = (char*)des;//目标字符串
	const char* src_tmp = (char*)src;源字符串

	if (des_tmp <= src_tmp || src_tmp + num < des_tmp)//情况2和情况1
	{
		while (num--)
		{
			*des_tmp++ = *src_tmp++;
			
		}
	}
	else//情况2
	{
		des_tmp += num - 1;
		src_tmp += num - 1;
		while (num--)
		{
			*des_tmp-- = *src_tmp--;
		}
	}
	return ret;返回目标字符串首地址
}

                注:在前两种情况下memcpy和memmove的作用完全相同,在情况2下,memvpy会出错,memmove则不会,memcpy可以看做是memmove的一个子集。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值