C语言中内存重叠问题.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言中内存重叠问题

内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。 在函数strcpy和函数memcpy都没有对内存重叠做处理的,使用这两个函数的时候只有程序员自己保证源地址和目标地址不重叠,或者使用memmove函数进行内存拷贝。 memmove函数对内存重叠做了处理。 现在来看函数strcpy 原型:extern char *strcpy char *dest,char *source ; 功能:把source所指由NULL结束的字符串复制到dest所指的数组中。 说明:source和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳source的字符串。 返回指向dest的指针。 重叠从两方面考虑: 1 .dest数据覆盖了source; 如:dest 8byte 地址:1000 source 8byte 地址:1002 2 .dest所指的区域本来就是source的一部分; 如:dest 8byte 地址:1000 source 8byte 地址:0998 例如:针对第一种交叉情况情况,dst src且dst+count src,memcpy和memmove的结果是一样的。请看下面的例子讲解: string s hello world; memmove s[0],s[5],10 ; 举个内存重叠环境的例子: int main char *p NULL; p char* malloc 100 ; memcpy p,1座机电话号码,strlen 1座机电话号码 ; //会等到错误的结果,有一个长度参数,只能拷贝cnt个 //字节就结束了 printf before p %s\n,p ; strcpy p+1,p ; //注意:这里重叠了,而strcpy是根据判断原串中的\0 printf after p %s\n,p ; free p ; 1.下面来看strcpy 原型写法: 字符串拷贝.? 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 count 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 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; return dest; 深入分析: void *memcpy void *dst, const void *src, size_t count : void *memmove void *dst, const void *src, size_t count ; 先看一个测试: #include #include int main int a[10]; for int i 0; i 10; i++ a[i] i; memcpy a[4],a,sizeof int *6 ; //结果为:1 2 3 0 1 2

文档评论(0)

zilaiye + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档