当前位置:网站首页>C语言实现memcpy、memmove

C语言实现memcpy、memmove

2022-07-23 08:05:00 久菜

> 1.模拟实现memcpy函数

//------------my_memcpy;--拷贝任意类型的元素,通过字节拷贝
// 原理:给出目的地与起始地地址,按字节数单个拷贝,字节数为0时拷贝结束
// 格式:my_memcpy(dest,src,num)--num是需要拷贝的字节数
// 返回值:返回目的地的地址
// 功能:负责拷贝两块独立内存空间的数据,不能自己内部拷贝,实现重叠内存拷贝用memmove()
// 
//void* my_memcpy(void* dest, const void* src, size_t num)//void*泛型指针接收地址,应对不同类型的情况
//{
    
// assert(dest && src);
// void* ret = dest;
// while (num--)//要拷贝的字节为0跳出循环
// {
    
// *(char*)dest = *(char*)src;
// //强制类型转化为char*类型,每次指针加一跳过一个字节,解引用访问一个字节,精度最细,方便应对各种类型的元素的字节的拷贝
// //dest = ((char*)dest)++;
// //src = ((char*)src)++;
// //这种写法实质上是:强制类型转化时创建了一个临时变量,对其解引用无意义,c++不支持这种写法,建议写成下列写法
// dest = (char*)dest + 1;
// src = (char*)src + 1;
// }
// return ret;
//}
//int main()
//{
    
// //整形
// int arr[] = { 0,1,2,3,4,5,6,7,8 };//36byte
// int arr2[20] = { 0 };
// my_memcpy(arr2, arr, 36);
// for (int i = 0; i < 9; i++)
// {
    
// printf("%d ", arr2[i]);
// }
// //---如果你想把012345678拷贝成012301234,是不行的,因为在这个过程中
// //--my_memcpy(arr2+4,arr2,36)在拷贝完3以后,想去拷贝4的时候发现源串的临时拷贝中的
// //-已经先被改为0了
// printf("\n");
// //字符串
// char str[] = "abcdef";
// char str2[10] = { 0 };
// my_memcpy(str2, str, 6);
// printf("%s\n", str2);
// return 0;
//}

> 2.模拟实现memmove函数

//-----------------my_memmove()
//格式:my_memmove(dest,src,num)--num是要拷贝的字节个数
//这个函数和my_memcpy的区别就是它可以处理重叠内存之间的数据的拷贝
//void* my_memmove(void* dest, const void* src, size_t num)
//{
    
// assert(dest && src);
// void* ret = dest;
// //dest处于src的num个字节范围的前面
// //此时只能从前向后拷贝
// if (dest < src)
// {
    
// while (num--)
// {
    
// *(char*)dest = *(char*)src;
// dest = (char*)dest + 1;
// src = (char*)src + 1;
// }
// }
// //1.dest处于src范围中间,此时只能从后向前拷贝
// //2.dest处于src范围后面,也就是dest>src,此时可以任意方向拷贝
// else
// {
    
// while (num--)
// {
    
// *((char*)dest + num) = *((char*)src + num);
// }
// }
//
// return ret;
//}
//int main()
//{
    
// //整形
// int arr[20] = { 0,1,2,3,4,5,6,7,8 };
// my_memmove(arr+3, arr, 20);//把01234拷贝过去34567的位置,一共20byte
// for (int i = 0; i < 9; i++)
// {
    
// printf("%d ", arr[i]);
// }
// printf("\n");
//
// int arr2[20] = { 0,1,2,3,4,5,6,7,8 };
// my_memmove(arr2, arr2+3, 12);//把345拷贝过去012的位置,一共12byte
// for (int i = 0; i < 9; i++)
// {
    
// printf("%d ", arr2[i]);
// }
// return 0;
//}

原网站

版权声明
本文为[久菜]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_52669146/article/details/125939249