当前位置:网站首页>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;
//}
边栏推荐
- 回文相关题目
- Fabric.js 基础笔刷
- 赛扬n5095处理器怎么样 英特尔n5095核显相当于什么水平
- BGP federal experiment
- 拖拽----
- 考研题库小程序中如何实现打开考研思维导图pdf
- Using redis to realize distributed lock (single redis)
- 笔记本酷睿i5 1135g7相当于什么水平?i5 1135g7性能怎么样
- canvas橡皮擦功能
- How to open the thought map pdf of postgraduate entrance examination in the small program of postgraduate entrance examination question bank
猜你喜欢

求岛屿最大面积--深度优先搜索(染色法)

What level is the Core i7 1165g7 equivalent to? What grade does the i71165g7 belong to

MySQL enables scheduled task execution

第九天笔记

What's the difference between core i9 12950hx and i9 12900hx

多重背包!

买卖股票的最佳时机

小米12S Pro和小米12Pro天玑版区别 两者配置对比

Notes on the fifth day

酷睿i7 1165g7相当于什么水平 i71165g7属于哪个档次
随机推荐
Spark统计每天新增用户
Stream stream is used for classification display.
200 lines of code, in-depth analysis of the principle and implementation of dynamic calculation diagram
Principle of container network
How about the performance of Ruilong R7 Pro 5875u? What level is it equivalent to
Le shell a besoin de connaître les commandes
链表复习!
英特尔赛扬7300性能怎么样?相当于什么水平级别
The difference between Celeron n4000 and Celeron n5095
Renforcement de l'apprentissage - points de compréhension du gradient stratégique
js 实现 encode64 加密
Static comprehensive experiment (HCIA)
Day 11 notes
天玑820相当于骁龙多少处理器 天玑1100相当于骁龙多少 天玑820怎么样
Where does pytorch work?
酷睿i7 1165g7相当于什么水平 i71165g7属于哪个档次
设计例化和连接
rtx3070ti显卡什么水平 rtx3070ti显卡什么级别 rtx3070ti显卡怎么样
鸡与蛋,产品与策略
UIScrollView(UICollectionView)禁止横向和竖向同时滑动