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的一个子集。

猜你喜欢

转载自blog.csdn.net/weixin_58250064/article/details/125781408