下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。在函数strcpy和函数memcpy都没有对内存重叠做处理的,使用这两个函数的时候只有程序员自己保证源地址和目标地址不重叠,或者使用memmove函数进行内存拷贝。memmove函数对内存重叠做了处理。现在来看函数strcpy原型:extern char *strcpy(char *dest,char *source);功能:把source所指由NULL结束的字符串复制到dest所指的数组中。说明:source和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳source的字符串。返回指向des
2、t的指针。重叠从两方面考虑:(1).dest数据覆盖了source; 如:dest(8byte) 地址:1000source(8byte) 地址:1002(2).dest所指的区域本来就是source的一部分; 如:dest(8byte) 地址:1000source(8byte) 地址:0998例如:针对第一种交叉情况情况,dst<src且dst+count>src,memcpy和memmove的结果是一样的。请看下面的例子讲解:string s = "hello world"memmove(&s0,&s5,10);举个内存重叠环境的例子:int
3、 main()char *p = NULL;p=(char*)malloc(100);memcpy(p,"123456789",strlen("123456789"); /会等到错误的结果,有一个长度参数,只能拷贝cnt个/字节就结束了printf("before p =%sn",p);strcpy(p+1,p); /注意:这里重叠了,而strcpy是根据判断原串中的'0'printf("after p =%sn",p);free(p);1.下面来看strcpy()原型写法: 字符串拷贝.
4、;char *strcpy(char *strDest, const char *strSrc)assert(strDest!=NULL) && (strSrc !=NULL);char *address = strDest; while( (*strDest+ = * strSrc+)·1 != '/0') NULL ; return address ; 2.下面来看下memcpy函数的原型写法:内存拷贝void *memcpy(void *dest, const void *source, size_t co
5、unt)assert(NULL != dest) && (NULL != source);char *tmp_dest = (char *)dest;char *tmp_source = (char *)source;while(count -)/不对是否存在重叠区域进行判断*tmp_dest + = *tmp_source +;return dest;3.下面来看下memmove函数的原型写法:void *memmove(void *dest, const void *source, size_t count)assert(NULL != dest) && (
6、NULL != source);char *tmp_source, *tmp_dest;tmp_source = (char *)source;tmp_dest = (char *)dest;if(dest + count<source) | (source + count) <dest)/ 如果没有重叠区域while(count-)*tmp_dest+ = *tmp_source+;else /如果有重叠(反向拷贝)tmp_source += count - 1;tmp_dest += count - 1;while(count-)*-tmp_dest = *-tmp;retur
7、n dest;深入分析:void *memcpy(void *dst, const void *src, size_t count):void *memmove(void *dst, const void *src, size_t count);先看一个测试:#include <string.h>#include <stdio.h>int main() int a10;for(int i=0; i < 10; i+)ai = i;memcpy (&a4,a,sizeof(int)*6); /结果为:1 2 3 0 1 2 3 0 1/memcpy(&
8、;a4, a, sizeof(int)*6); /结果为:1 2 3 0 1 2 3 0 1(vc下和下面一个相同)/MemMove(&a4,a,sizeof(int)*6); /结果为:1 2 3 0 1 2 3 4 5/memmove(&a4,a,sizeof(int)*6); /结果为:1 2 3 0 1 2 3 4 5/MemMove(a,&a4,sizeof(int)*6); /结果为:5 6 7 8 9 6 7 8 9/memmove(a, &a4, sizeof(int)*6);/结果为:5 6 7 8 9 6 7 8 9/memcpy(a, &a
9、mp;a4, sizeof(int)*6); /结果为:5 6 7 8 9 6 7 8 9/MemCopy(a,&a4,sizeof(int)*6); /结果为:5 6 7 8 9 6 7 8 9for(i = 0; i < 10; i+)printf("%d ",ai);printf("/n");return 0;它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果都是一样的。但有交叉时不一样。源内存和目标内存交叉的情况有以下两种:(左边为低地址)即:dst
10、<=src 且 dst+count>src针对第一种交叉情况情况,dst<=src且dst+count>src,memcpy和memmove的结果是一样的。请看下面的例子讲解:int a = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;memcpy(a, a+4, sizeof(int)*6);和memmove(a, a+4, sizeof(int)*6);结果一样,都是:4567896789针对第二种情况,src<dst且src+count>dst,memcpy和memmove的结果是不一样的。请看下面的例子:int a = 0, 1, 2,
11、 3, 4, 5, 6, 7, 8, 9;memcpy(a+4, a, sizeof(int)*6) 结果按照分析应该是:0123012301但是在vs2005上运行却是:0123012345(有知道的,请告诉我原因)memmove(a+4, a, sizeof(int)*6) 结果是:0123012345总结:1. 当 src 和 dest 所指内存区有重叠时,memmove 相对 memcpy 能提供保证:保证能将 src 所指内存区的前 n 个字节正确的拷贝到 dest 所指内存中;2. 当 src 地址比 dest 地址低时,两者结果一样。换句话说,memmove 与 memcpy 的
12、区别仅仅体现在 dest 的头部和 src 的尾部有重叠的情况下;综上所述在进行内存重叠的考虑时,strcpy,memcpy都要做一个内存重叠的判断:对于memcpy需要加上一个断言:Assert(dst<=src | src+count<dst);source和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳source的字符串。返回指向dest的指针。对于strcpy需要加上一个断言:int count = strlen(src) + 1;/src lengthAssert (dest<src | dest>(src+count)考虑了内存重叠的内存拷
13、贝函数 memcpy ,相当于memmove考虑内存重叠的字符串拷贝函数strcpychar * strcpy(char *dest, const char *src) char *d = dest; /backup input char *s = src; int count = 0; assert(dest); /非空指针检查 assert(src); if(src
14、= dest) return src; count = strlen(src) + 1;/src length if(count<=1) return 0; /empty src if(dest<src | dest>(src+count) while(count-) *d+ = *s+; else /dest 位于src+count中间, d = dest+coun
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- dcapdca循环管理方法
- InteproSystems英特普罗公司介绍
- GATT与WIO多边贸易体制下的无条件最惠国待遇
- GPS与GIS在物流中的作用封顺
- HR2劳动合同管理实训
- Linux下音频设备编程
- 2026年测绘工程设计师《测绘工程管理》模拟卷
- 2026年通观全文分析题目含义及答案
- 岩棉卷棉施工方案
- 2026年注册测绘师考试大地测量学技术规范试卷
- 2026年比亚迪保养及保修手册
- 电网特种作业人员持证参考目录
- 《第一章 人体的内环境与稳态》课件
- 河南省鹤壁市重点学校小升初入学分班考试语文考试试题及答案
- 中暑急救新进展与新技术
- 低温等离子体和脉冲电场灭菌技术
- 铁路专用线设计规范(试行)(TB 10638-2019)
- 培训课件 -华为铁三角工作法完全解密
- 生猪屠宰场突发环境事件应急预案
- 河南豫膜环保科技有限公司年产200万平方米中空纤维膜及配套设备项目环境影响报告
- 安徽敬同药业公司抗癌类药物研发项目环境影响报告表
评论
0/150
提交评论