剖析memcpy和memmove区别

对于相同不同内存块memcpy和memmove都能实现内存拷贝,对于相同内存块memmove仍然可以实现内存拷贝,但是memcpy可能就实现不了了。主要原因就是memcpy只是进行从头到尾的拷贝而memmove可根据不同情况可能是从头到尾的拷贝也可能是从尾到头的拷贝

不同内存块

在这里插入图片描述

内存重叠(相同内存块)

在这里插入图片描述
可以看到这样的重叠方式中字符串src = “ello”,dst = “hello”
拷贝后dst = “ello”,也可以正常拷贝。

在这里插入图片描述

如果是这样的重叠方式,memcpy因为是从头到尾的拷贝拷贝的过程也会不断覆盖,导致拷贝不成功。而在这种情况下memmove采取的是从尾到头拷贝可以拷贝成功。

分享我写的memcpy和memmove帮助大家理解

MyMemcpy

void MyMemcpy(void *_dst, const void *_src, int size)
{
	char *dst = (char*)_dst;
	char *src = (char*)_src;//因为是内存拷贝因为强制类型转换尾char这样解引用后就可以逐个字节拷贝
	while (size--)//size是src的字节数量
	{
		*dst = *src;
		dst++;
		src++;
	}
}

MyMemmove

void MyMemmove(void *_dst, const void *_src, int size)
{
	char *dst = (char*)_dst;
	char *src = (char*)_src;
	if (dst > src && dst < src+size)//满足内存上述的第二种内存重叠时采用从尾到头的拷贝方式
	{
		for (int i = size-1; i >= 0;--i)
		{
			dst[i] = src[i];
		}
	}
	else//正常情况下采用从头到尾拷贝
	{
		for (int i = 0; i < size; i++)
		{
			dst[i] = src[i];
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值