memmove():将 num 字节的值从源所指向的位置复制到目标所指向的内存块。复制就像使用中间缓冲区一样进行,允许目标和源重叠。
当我们要模拟实现memmove函数时得考虑到字符未被移动而被其他字符覆盖
int main()
{
int a1[10] = { 1,2,3,4,5,6,7,8,9,20 };
int a2[5] = { 0 };
int sz1 = sizeof(a1) / sizeof(a1[0]);
my_memmove(a1, a1 + 2, 20);
for (int i = 0; i < sz1; i++)
{
printf("%d ", a1[i]);
}
return 0;
}
就比方说上面这段代码,我们要用my_memmove()获取我们想要得到的数组
3,4,5,6,7,6,7,8,9,20
但是如果原数组在移动时先将7覆盖5的话,那5这个数据便会缺失,使得我们的my_memmove()无法与memmove做到同样效果。
#include<stdio.h>
void* my_memmove(void* x, void* y, size_t mun)
{
void* ret = x;
if (x < y)
{
while (mun--)
{
*(char*)x = *(char*)y;
x = (char*)x + 1;
y = (char*)y + 1;
}
}
else
{
while (mun--)
{
*((char*)x + mun) = *((char*)y + mun);
}
}
return ret;
}
所以可以分两种情况来进行数据移动,如上提供的代码一般。用一个参数mun控制移动数据的长度,移动量为地址*x与地址*y之间的距离量。倘若在同一组数组中,要移动数据的起始地址(*y)高于移动的末尾位置(*x),可以先从最终位置开始进行数据拷贝,在提供的数组中将*y的数据覆盖*x的数据;要移动数据的起始地址低于移动的最终位置,则将起始地址和最终位置都加上移动量,相当于从要移动的数据段的末尾开始拷贝数据