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
而实际的结果为:
memcpy拷贝重叠及memmove_第1张图片
原因如下:
memcpy拷贝重叠及memmove_第2张图片
在拷贝过程中,由于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;
}

运行结果:
memcpy拷贝重叠及memmove_第3张图片
memmove可以解决内存拷贝重叠引起的错误问题

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

你可能感兴趣的:(C语言)