天天看点

C++实现内存复制函数(memmove解决内存重叠)

memmove函数用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。

例如将ABC段复制到BCD段时,目标区域和源区域有重叠,当A段复制到B段时,B段发生损坏,无法再将完整的B段复制。

C++实现内存复制函数(memmove解决内存重叠)
C++实现内存复制函数(memmove解决内存重叠)

因此发生存在区域重叠时采用逆向复制

void* my_memmove(void*dest, const void* src, size_t n)
{
	char*_dest = (char*)dest;
	const char*_src = (char*)src;
	if (_dest > _src&&_dest < _src + n)//发生区域重叠
	{
		while (n--)
		{
			*_dest--= *(_src+n);//逆向复制
		}
	}
	else//未发生区域重叠 正向复制
	{
		while (n--)
		{
			*_dest++ = *_src++;
		}
	}
	return dest;
}
int main()
{
	int s[4] = {1,2,3,4};
	for (int i = 0; i < 4; i++)
	{
		cout << s[i] << "";
	}
	cout << endl;
	my_memmove(s+2, s + 3,1*sizeof(int));
	for (int i = 0; i < 4; i++)
	{
		cout << s[i]<<"";
	}
	getchar();
	return 0;
}
           

继续阅读