我们都知道关于内存拷贝函数有memcpy,它可以按照所需的字节数来拷贝相应的元素
但是当内存重叠的时候,他就会产生错误。
就比如一个数组在自己的内存中拷贝:
前两个拷贝得都没有问题,但是当拷贝第三个数据时,由于前面的数据覆盖了之前的内存 ,结果就会发生错误,此时会发现3已经被1覆盖。
错误结果如下:
今天我们就来模拟一下memmove函数。
难点:如何使重叠的内存不被干扰??
从刚刚的那组数据出发:
我们发现假如从后往拷贝似乎就不会出现问题,也就是将3赋给5,然后将2赋给4,最后将1赋给3
但是所有的情况都适用吗??
其实不然,当目标数组在来源数组的后面时情况就恰好相反,此时需要正向拷贝才不会出现错误:
所以我们就要分情况讨论:1.当指针des在source左边时要正向拷贝
2.当指针dest在source右边时要反向拷贝
知道了函数的的设计原理,下面就是代码的实现:
#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;
}
结果为:
这是针对这种情况
以上就是全部的内容