C/C++ memmove与memcpy的区别及实现

发布时间:2020-11-11 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了C/C++ memmove与memcpy的区别及实现编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.与字符串函数strcpy区别:

  • memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。
  • memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止。

2.函数说明:        

  1. memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
  2. memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。

3.拷贝情况:

      拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况:

      1.当src内存区域和dst内存区域完全不重叠

     2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前

     3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前

 

     上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。

4.代码实现

memcpy:

void* _memcpy(void* dest,const void* src,size_t count)
{
	assert(src != nullptr&&dest != nullptr);
	//判断dest指针和src指针是否为空,若为空抛出异常
	char* tmp_dest = (char*)dest;
	const char* tmp_src = (const char*)src;
	//将指针dest和指针src由void强转为char,
	//使得每次均是对内存中的一个字节进行拷贝
	while (count--)
		*tmp_dest++ = *tmp_src++;
	return dest;
}

memmove: 

void* _memmove(void* dest,size_t count)
{
	assert(src != nullptr&&dest != nullptr);
	//判断dest指针和src指针是否为空,若为空抛出异常
	char* tmp_dest = (char*)dest;
	const char* tmp_src = (const char*)src;

	if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝
		while (count--)
			*tmp_dest++ = *tmp_src++;
	else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝
	{
		tmp_src += count - 1;
		tmp_dest += count - 1;
		while (count--)
			*tmp_dest-- = *tmp_src;
	}
	//else(tmp_src==tmp_dest) 此时不进行任何操作
	return dest;
}

转载于https://www.cnblogs.com/lyl-312/p/5514988.html

总结

以上是编程之家为你收集整理的C/C++ memmove与memcpy的区别及实现全部内容,希望文章能够帮你解决C/C++ memmove与memcpy的区别及实现所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478