memcpy拷贝重叠及memmove

一.memcpy
功能:从源内存地址起始位置拷贝若干个字节到目标地址中

void* my_memcpy(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	while (count--)
	{
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return ret;
}

但是在拷贝重叠时则可能会出现错误:
例如:

int main()
{
	char arr1[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	my_memcpy(arr1+2, arr1, 4);
	cout << arr1 << endl;
	return 0;
}

在这里我们想从arr1起始位置拷贝4个字节到arr1+2的位置
想要得到的结果是:1 2 1 2 3 4 7 8 9
而实际的结果为:
在这里插入图片描述
原因如下:
在这里插入图片描述
在拷贝过程中,由于src在dst左侧,因此src内容发生改变,引起错误
解决方法:memmove

二.memmove
功能:memmove用于拷贝字节,但是目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源内容会被更改

void* my_memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src)
	{
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return ret;
}

运行结果:
在这里插入图片描述
memmove可以解决内存拷贝重叠引起的错误问题

  • 当dst在src左侧或者在同一位置时,从前向后进行拷贝
  • 其他情况则从后向前拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值