memmove和memcpy函数的区别及实现
来源:互联网 发布:淘宝买被子好吗 编辑:程序博客网 时间:2024/05/24 05:42
一、memmove()和memcpy()函数和strcpy()函数的区别;
(1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存拷贝;
(2)strcpy()以’\0’为拷贝的结束条件;而memmove()和memcpy()函数则是以第三个参数num进行控制拷贝;
二、函数说明:
1.memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
2.memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝
三、memmove()和memcpy()函数的区别和联系:
相同点: 两个都是内存拷贝,对所有类型都适用;
不同点:
(1)memcpy()函数是从前往后拷贝;假入出现内存重叠的现象;拷贝结果可能出错;
(2)memmove()函数在memcpy()函数的基础上加入了对内存重叠拷贝的处理;引入了倒序拷贝的方式处理内存重叠的某些情况;保证拷贝的正确性;
综上:在现实中使用memmove()函数会比较好一点;
四、各种拷贝情况:
上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。
五、模拟实现:
memcpy:
//模式实现memcpy(不会解决内存重叠的问题,正序拷贝,适用于任何类型)void* MyMemcpy(void* dest,const void* src,size_t num){ char* dest_tmp=(char*)dest;//目标字符串 const char* src_tmp=(const char*)src;//源字符串 assert(dest&&src); while(num--) { *dest_tmp++= *src_tmp++; } return dest;}
memmove:
//模拟实现memove(会解决内存重叠的问题,加上了逆序拷贝,适用于任何类型)void* MyMemmove(void* dest,const void* src,size_t num){ char* dest_tmp=(char*)dest; const char* src_tmp=(const char*)src; assert(dest&&src); if (src_tmp>dest_tmp || src_tmp+num<=dest_tmp)//情况1和情况2 { while(num--)//正序复制 { *dest_tmp++=*src_tmp++; } } else//情况3,逆序赋值 { //调整指针到最后 dest_tmp+=num-1; src_tmp+=num-1; while(num--) { *dest_tmp--=*src_tmp--; } } return dest;}
阅读全文
1 0
- memmove和memcpy函数的区别及实现
- memcpy,memmove函数实现及区别
- memcpy函数和memmove函数的模拟实现与区别
- memcpy和memmove函数的区别和实现
- memcpy函数和memmove函数的区别
- memmove、memcpy和memccpy简介及函数的实现
- memmove、memcpy和mem**y简介及函数的实现
- strcpy、memcpy、memmove的区别及实现
- memcpy和memmove的区别与实现
- memcpy和memmove的区别与实现
- memcpy和memmove的区别与实现
- memcpy和memmove函数的实现
- memcpy和memmove函数的实现
- memcpy和memmove的函数内部实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- 利用WinRAR的自解压格式将Cocos2d-x项目代码打包成.exe文件
- 递归算法典例
- angular核心$watch,$digest,$apply之间的联系
- 2017 计蒜之道 初赛 第一场 阿里的新游戏(找规律,几何,模拟)
- HDFS 指令(三)touchz,test,text,stat,appendToFile,checksum,count,chmod
- memmove和memcpy函数的区别及实现
- Java开学学习实录1
- TypeScript笔记
- java实现验证码类生成中文验证码
- Mac pro使用的那些坑(二)git的安装和git终端打开
- java登录验证码实现代码
- 冒泡排序(C语言实现)
- 链表相关程序练习
- java开发微信公众号支付