void* my_memmove(void*dest, void*src, size_t n)//从src指向的字节开始复制n个字节到dest指向的字节处
{
char*p = (char*)dest;
char*q = (char*)src;
while (dest <= src && n--)
{
*p = *q;
p++; q++;
}
//if (dest > src)//当if的条件成立执行的操作不需要循环就不要放在while里。
//{
// p = p + n - 1; //首先要改掉第n个字节(要复制n个最后一个就是第n个即p+n-1)
// q = q + n - 1;
// while (n--) //循环n次,下面是交换n次。因为有n个字节。
// {
// *p = *q;
// p--; q--;
// }
//}//下面是简版。
while (dest > src && n--) /*判断条件的时候n确实是20,先使用再减减,判断完条件即使用完,进入循环时已经是19了。*/
{
*(p + n-1) = *(q + n-1);//这里是错的为了记住就写成这样,所以这里写成p+n就可以了
}
return dest;
}
int main()
{
int i = 0;
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int* p = (int*)my_memmove(arr+2, arr, 20);//下面不能用p[i]来打印,p作为起始地址时,他后面已知元素是不够10个的,如果这样打印会非法访问。因为后面的指针相当于未初始化,指向未知。
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
模拟实现memmove
最新推荐文章于 2024-10-04 23:00:36 发布