我们都知道关于内存拷贝函数有memcpy,它可以按照所需的字节数来拷贝相应的元素

模拟实现库函数memmove_数组

但是当内存重叠的时候,他就会产生错误。

就比如一个数组在自己的内存中拷贝:

模拟实现库函数memmove_数据_02

前两个拷贝得都没有问题,但是当拷贝第三个数据时,由于前面的数据覆盖了之前的内存 ,结果就会发生错误,此时会发现3已经被1覆盖。

模拟实现库函数memmove_数据_03

错误结果如下:

模拟实现库函数memmove_数据_04

今天我们就来模拟一下memmove函数。

难点:如何使重叠的内存不被干扰??

从刚刚的那组数据出发:

模拟实现库函数memmove_i++_05

我们发现假如从后往拷贝似乎就不会出现问题,也就是将3赋给5,然后将2赋给4,最后将1赋给3

模拟实现库函数memmove_数组_06

但是所有的情况都适用吗??

其实不然,当目标数组在来源数组的后面时情况就恰好相反,此时需要正向拷贝才不会出现错误:

模拟实现库函数memmove_i++_07

所以我们就要分情况讨论:1.当指针des在source左边时要正向拷贝

                                           2.当指针dest在source右边时要反向拷贝

模拟实现库函数memmove_i++_08

知道了函数的的设计原理,下面就是代码的实现:

#include<stdio.h>
void* my_memmove(void* des, void* source, size_t num)
{
	void* ret = des;
	size_t i = 0;
	if (des <= source)
	{
		
		for (i = 0; i < num; i++)
		{
			*((char*)des + i) = *((char*)source + i);
			
		}
		return ret;
	}//这是从前往后拷贝
	else
	{
		for (i = num; i > 0; i--)
		{
			*((char*)des + i - 1) = *((char*)source + i - 1);
		}
		return ret;
	}//这是从后往前拷贝
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	
	my_memmove(arr1 + 2, arr1 , 8);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

结果为: 

模拟实现库函数memmove_数组_09

这是针对这种情况 

模拟实现库函数memmove_数组_10

以上就是全部的内容