下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
memmove、memcpy和mem**y三个函数都是内存的拷贝,从一个缓冲区拷贝到另一个缓冲区。memmove(void*dest,void*src,intcount)memcpy(void*dest,void*src,intcount)mem**y(void*dest,void*src,intch,intcount)表头文件:#include<string.h>定义函数:void*memcpy(void*dest,constvoid*src,size_tn)函数说明:memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'/0'而结束返回值:返回指向dest的指针表头文件:#include<string.h>定义函数:void*mem**y(void*dest,constvoid*src,intc,size_tn);函数说明:mem**y()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。与memcpy()不同的是,mem**y()如果在src中遇到某个特定值(intc)立即停止复制。返回值:返回指向dest中值为c的下一个字节指针。返回值为0表示在src所指内存前n个字节中没有值为c的字节。表头文件:#include<string.h>定义函数:void*memmove(void*dest,constvoid*src,size_tn);函数说明:memmove()是从一个缓冲区移动到另一个缓冲区中。返回值:返回指向dest指针。当dest<=src-count或dest>=src+count时,以上三个函数均不会产生覆盖问题,即源数据不会被更改。若不在以上范围内,则源数据会被更改。如:chara[]={'a','b'};charb[]={'c','d','e','f','g','h'};memmove(a,b,sizeof(b));或是直接char*p=b+2;memmove(p,b,sizeof(b));输出数据会发现b中数据输出已被更改。发现即使a数组指向的空间不够存储数据,也能够移动成功。原因|dest-src|<count如果在使用这些函数时,分配给足够的空间,然后再使用就不会出现覆盖问题。也就是说如果外部分配给的空间不足以存储要拷贝的数据时,就有可能出现源数据被覆盖更改的问题。#include<stdio.h>#include<stdlib.h>#include<string.h>voidmain(void){inti=0;chara[9]={'a','b','c','d','e','f','g','h','/0'};charp[2]={'q','w'};//或char*p=a+2;memmove(p,a,sizeof(a));puts(a);printf("_____________________________________________/n");puts(p);printf("_____________________________________________/n");for(i=0;i<10;i++)printf("%c%d/n",*(a+i),a+i);printf("_____________________________________________/n");for(i=0;i<8;i++)printf("%c%d/n",*(p+i),p+i);}观察输出结果。把memmove(p,a,sizeof(a));改为memcpy(p,a,sizeof(a));或mem**y(p,a,'e',sizeof(a));再观察输出结果。可以看出在目的存储空间不足时,便会出现源数据被覆盖改变的问题。如果目的存储空间分配足够的空间,则便不会出现覆盖问题。memcpy()、memmove()、memset()的实现void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize)与strcpy相比,memcpy并不是遇到'/0'就结束,而是一定会拷贝完n个字节。viewplaincopytoclipboardprint?void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize){assert((pvTo!=NULL)&&(pvFrom!=NULL));//使用断言byte*pbTo=(byte*)pvTo;//防止改变pvTo的地址byte*pbFrom=(byte*)pvFrom;//防止改变pvFrom的地址while(size-->0)pbTo++=*pbFrom++;returnpvTo;}void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize){assert((pvTo!=NULL)&&(pvFrom!=NULL));//使用断言byte*pbTo=(byte*)pvTo;//防止改变pvTo的地址byte*pbFrom=(byte*)pvFrom;//防止改变pvFrom的地址while(size-->0)pbTo++=*pbFrom++;returnpvTo;}memmove()功能将指针src指向的前n个字节拷贝到dest指向的前n个内存区域中可能出现dest和scr内存重叠的情况,都进行了很好的处理,这也是和mencpy()的区别之处viewplaincopytoclipboardprint?vord*memmove(void*dest,constvoid*src,size_tcount){void*ret=dest;if(dest<=src||dest>=src+count){while(count--)dest++=*src++}else{dest+=count-1;src+=count-1;while(count--)dest--=*src--}returnret;}vord*memmove(void*dest,constvoid*src,size_tcount){void*ret=dest;if(dest<=src||dest>=src+count){while(count--)dest++=*src++}else{dest+=count-1;src+=count-1;while(count--)dest--=*src--}returnret;}void*memset(void*s,intc,intn)用c填充由指针s指向的内存区域的前n个字节.返回指向该内存区域的指针s.s并不一定是指向字符的指针,以是指向任何类型的指针,甚至可以是指向结构的指针.viewplaincopy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 办公室消防演练方案
- 《医疗器械经营质量管理规范》培训试卷测试题及答案
- 2025年2月信息技术试题库含参考答案
- 2025年外科期末考核题目与答案
- 法务岗位招聘笔试题与参考答案2025年
- 董事会秘书持续学习与知识更新规划
- 隧道工程绿色施工实施方案
- 产品迭代规划及执行策略
- 口腔医学技术士年度工作计划与目标设定
- 金融产品销售人员的招聘与选拔
- 多人合伙建房合同范本
- 2025年胸膜炎护理试题及答案
- 上海购房合同(标准版)
- 2025年青海省公务员申论考试真题试卷(含答案)
- 文旅产业知识培训课件
- 浙江省浙南名校联盟2025-2026学年高三上学期10月联考英语试题
- 2026届新高考英语冲刺热点复习 2025年新高考1卷阅读理解D篇说题
- 新能源公交安全培训内容课件
- 企业人力资源数字化管理平台方案
- 2025年广东铁投集团校园招聘笔试参考题库附带答案详解
- 工作快乐生活演讲稿
评论
0/150
提交评论