内存函数 memcpy、memmove 的简单模拟实现
创始人
2024-01-16 07:12:12
0

一、memcpy 函数

数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。注意是以字节为单位进行拷贝。函数声明如下:

1、参数返回值解析

第二个参数 src:源地址,即你要从哪开始拷贝。

第三个参数 count:字节数,即从源地址起始位置开始一共要拷贝多少个字节。

第一个参数 dst:目的地址。也就是你拷贝的内容要放到哪。

返回值:返回目标空间的地址。

2、使用注意

该函数有如下两个注意事项:

  • 因为是内存函数,并不会以' \0 '作为结束符。
  • 不适合用于处理内存重叠的情况。举个例子,将源地址的第1 ~ 4个字节拷贝到源地址的第3 ~ 6的字节位置上,此时发生了内存重叠。(如果有内存重叠,则需要使用memmove函数)

3、模拟实现

因为是逐字节拷贝,所以解引用的时候,每次访问只能访问一个字节,前面在说指针类型的时候提到,指针类型决定了解引用每次可以访问多少个字节。

因此,在拷贝之前,先将源地址和目标地址的指针类型转化为 char* 类型,这样的话,每次解引用就只会访问一个字节。

#include 
#include void* my_memcpy(void* dst, const void* src, size_t num)
{assert(dst && src);char* target = (char*)dst;		        // 转化为 char*,解引用时只会访问一个字节		const char* source = (const char*)src;  while (num--){*target = *source;target++;source++;}return dst;
}int main() {int dst[10] = { 0 };int src[5] = { 1,2,3,4,5 };my_memcpy(dst, src, sizeof(src));for (size_t i = 0; i < 10; i++){printf("%d ", dst[i]);}return 0;
}

测试结果如下:

二、memmove 函数

1、认识memmove函数

当源地址和目标地址没有重叠的时候,memmove函数 和 memcpy函数的功能是一样的,但是如果遇到内存重叠的情况,比如将源地址的第1 ~ 4个字节拷贝到源地址的第3 ~ 6的字节位置上。

函数声明如下, 参数解析可以参考 memcpy 函数

 

2、memmove函数模拟实现

在模拟实现的时候,需要考虑的是,源地址和目的地址的位置。如果源地址在目的地址的左边,此时应该先将末尾的字节拷贝到目标地址的末尾。如果按正常顺序拷贝的话,就会变成右边这种情况,明明 3 也是要拷贝到目标地址的,但是现在却被新拷贝的覆盖了。

如果        边,应该是从后往前拷贝。这个时候相当于是把蓝色框里的内容向后移动了一样,最先移动的是最右边的内容。

 如果源地址在目的地址的右边,那么这个时候,就应该是从前往后拷贝。这个时候就相当于是把蓝色框里的内容向前移动了一样,最先移动的是最左边的内容。

void* my_memmove(void* dst, const void* src, size_t num)
{assert(dst && src);char* target = (char*)dst;const char* source = (const char*)src;if (src < dst){// 源地址在目的地址的左边while (num--){*(target + num) = *(source + num);}}else if (src > dst){// 源地址在目的地址的右边while (num--){*target = *source;target++;source++;}}else{// 无需拷贝,直接返回return (void*)src;}
}int main() {int arr[8] = { 1,2,3,4,5,6,7,8 };my_memmove(arr, arr + 2 , 4 * sizeof(int));		//移动4个元素(16个字节)for (size_t i = 0; i < 8; i++){printf("%d ", arr[i]);}return 0;
}

 测试结果为:

相关内容

热门资讯

中国的节日风俗广播稿 关于中国的节日风俗广播稿精选  古怪节日集(广播稿)  三月3的稿,自己很辛苦得编辑,可别乱拿!!!...
计算机等级信息 : 计算机一...   计算机等级信息 : 2017计算机一级MSOffice考点解析  5.3.1视图  1.“普通”...
安全生产活动个人发言稿 安全生产活动个人发言稿(精选11篇)  在社会一步步向前发展的今天,能够利用到发言稿的场合越来越多,...
我的早年生活说课稿 我的早年生活说课稿  一、说教材:  1、设计理念:  根据新课程标准的要求,教学应树立以学生为主体...
高中家长会班长发言稿 高中家长会班长发言稿  家长会是针对一项或多项主题,以教师讲述和传达为主,以家长提问为辅的形式。小编...
大学生生活委员的竞选稿 大学生生活委员的竞选稿亲爱的老师们,亲爱的同学们,各位下午好!  我今日要竞选的是生活委员,我愿意为...
趣味运动会加油稿50字左右   趣味运动会加油稿该怎么写?怎么才能通过加油稿进行加油打气呢?下面是小编为大家整理分享的一些趣味运...
高中体育说课稿《武术初级长拳... 高中体育说课稿《武术初级长拳》  一、课的指导思想  依据新课标的要求,新的体育与健康课程在教育方式...
《爬天都峰》说课稿 《爬天都峰》说课稿范文三篇  作为一名辛苦耕耘的教育工作者,有必要进行细致的说课稿准备工作,说课稿有...
运动会加油稿件   运动会加油稿件(一)  赞三千米坚持者:漫漫长路,你愿一人独撑, 忍受着孤独与寂寞, 承受着体力...
《四季》说课稿 《四季》说课稿  作为一位杰出的教职工,常常要根据教学需要编写说课稿,说课稿有助于提高教师理论素养和...
新学期开学大会老教师代表发言... 新学期开学大会老教师代表发言稿  新学期开学大会老教师代表发言稿  尊敬的领导,亲爱的老师们:  大...
识字小圆镜小班语言说课稿 识字小圆镜小班语言说课稿  教案目标:  1、在游戏中复习所认识的生字、儿歌。  2、对读书感兴趣 ...
《吃虫草》说课稿 《吃虫草》说课稿范文3篇  作为一无名无私奉献的教育工作者,常常需要准备说课稿,借助说课稿可以有效提...
小学生友谊的诗歌朗诵 小学生友谊的诗歌朗诵3篇  在日常的学习、工作、生活中,大家都收藏过令自己印象深刻的诗歌吧,诗歌的内...
《做功的快慢》说课稿 《做功的快慢》说课稿  一、说教材  1、教学内容:做功的快慢  2、教材分析  《做功的快慢》一课...
家长会学生代表发言稿 家长会学生代表发言稿通用15篇  在日常生活和工作中,越来越多地方需要用到发言稿,发言稿是一种实用性...
赞美军人的朗诵稿 赞美军人的朗诵稿  漫长的学习生涯中,大家都对那些朗朗上口的朗诵稿很是熟悉吧,朗诵是一种比较精细、高...
爱岗敬业演讲稿题目全 2017爱岗敬业演讲稿题目(全)  爱岗敬业是人类社会最为普遍的奉献精神,它看似平凡,实则伟大。下面...
《济南的冬天》优秀说课稿 2020年《济南的冬天》优秀说课稿范文(精选9篇)  作为一名老师,就不得不需要编写说课稿,认真拟定...