首页 > 其他 > 详细

memcpy函数和memmove函数的模拟实现与区别

时间:2015-12-01 19:40:12      阅读:285      评论:0      收藏:0      [点我收藏+]
1、内存复制函数memcpy的模拟实现

void * my_memcpy(void * buf1, const void * buf2, int count)//内存复制函数
{
	assert(buf1);
	assert(buf2);//断言
	char * dest = (char *)buf1;
	char * src = (char *)buf2;//强制类型转换为char*,便于复制
	void * ret = buf1;//保留目标内存的首地址

	while (count--)
	{
		*dest++ = *src++;//从前向后复制 没有考虑内存重叠
	}

	return ret;//返回目标内存首地址
}

优点:
可以直接从内存复制,解决了字符串复制函数strcpy函数不能将包含多个‘\0‘的字符数组,完整的复制的问题。

缺点:
没有考虑内存重叠问题,例如:一个int数组arr[10]的内容为arr[10]={1,2,3,4,5,6,7,8,9,0};现在需要将3,4,5,三个数字,分别复制到5,6,7的位置,从前向后复制的时候,数字‘5’会丢失。
而memmove完整的解决了内存重叠问题

2、1、内存复制函数memmove的模拟实现
void * my_memmove(void * buf1, const void * buf2, int count)//内存移动函数
{
	assert(buf1);
	assert(buf2);//断言
	char * dest = (char *)buf1;
	char * src = (char *)buf2;//强制类型转换为char*,便于复制
	void * ret = buf1;//保留目标内存的首地址

	if ((src<dest) && (src + count>dest)) //内存重叠则从后向前复制
	{
		while (count--)
		{
			*(dest + count) = *(src + count);
		}
	}
	else
	{
		while (count--)
		{
			*dest++ = *src++;//从前向后复制 没有内存重叠
		}

	}

	return buf1;//返回目标内存首地址
}


memcpy函数和memmove函数的模拟实现与区别

原文:http://10788311.blog.51cto.com/10778311/1718571

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!