模拟实现memove
//模拟实现memmove函数
void* my_memove(void* arr1, const void* arr2, int sz)
{
//abcdefghijk 这里要分前后拷贝
void* left = arr1;
//如果 arr1<arr2那么就从前向后拷贝
if (arr1 < arr2)
{
while (sz--)
{
*(char*)arr1 = *(char*)arr2;
arr1 = (char*)arr1 + 1;
arr2 = (char*)arr2 + 1;
}
}
if (arr1 > arr2)//这里应该要从后向前拷贝
{
arr1 = (char*)arr1 + sz-1;
arr2 = (char*)arr2 + sz-1;
while (sz--)
{
*(char*)arr1 = *(char*)arr2;
arr1 = (char*)arr1 - 1;
arr2 = (char*)arr2 - 1;
}
}
return left;
}
int main()
{
//char arr1[50] = "abcdefghijk";
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memove(arr1, arr1+2, 20);
//printf("%s\n", arr1);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
模拟实现memove函数,在实现自我拷贝的时候主要解决掉错误覆盖问题,比如abcdefghijk,要把abc复制到bcd的位置,如果我把a复制到了b上,那么b就被覆盖了,等我想要拿b的时候它已经变成a了。话不多说直接上图
当dest再src前面的时候,应该从前向后拷贝(针对dest目标区域来说)就是先把3给1,4给2,这样当5给3的时候3已经用过了,所以被覆盖没有任何问题。
但是像这里,如果我先把7拷给了5,6拷给了4,那么当我想把5拷给3的时候你就会发现5已经换成了7,这就导致错误覆盖,无法实现自己想要的结果。
总结:简单来说,当dest<src的时候,从前往后拷贝,如果dest>=src从后往前拷贝。
模拟实现memcpy函数
//模拟实现my——memcpy函数
void* my_memcpy(char* arr1, char* arr2, int sz)
{
char* start = arr1;
arr2 += sz-1;
while (*arr2 != '\0')
{
*arr1 = *arr2;
arr1++;
arr2++;
}
return (void*)start;
}
int main()
{
char arr1[50] = "you are so lucky!";
char arr2[50] = "yes i am";
my_memcpy(arr1, arr2, 5);
printf("%s\n", arr1);
return 0;
}
memcpy函数,指定字节数,把arr2的内容固定长度拷贝给arr1.