- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
memcpy和memmove的区别与实现
区别:两个函数都是进行n字节内存内容的拷贝,入口参数和返回参数也都一样,可是这两个函数在内部实现上是有一定区别的,这主要是因为dest内存区域和src内存区域可能有一下四种不同的情况,注意count的影响:
从图中可以看出,src的内存区域和dest的内存区域相对位置和重叠关系有四种情况,memcpy没有考虑重叠的情况,而memmove考虑到了全部情况,因此memcpy函数的时候可能出现意向不到的结果。
这两个函数的实现:
***********下面两个是错误的实现**************
void* memcpy(void* dest, void* source, size_t count)
????? {
?????????? void* ret = dest;
????????? //copy from lower address to higher address
????????? while (count--)
????????????????? *dest++ = *source++; //不知道两个指针的类型,不可以这样自加。
?????????? return ret;
????? }
void* memmove(void* dest, void* source, size_t count)
{
void* ret = dest;
if (dest = source || dest = (source + count))
{
//Non-Overlapping Buffers
//copy from lower addresses to higher addresses
while (count --)
*dest++ = *source++;
} else{
//Overlapping Buffers
//copy from higher addresses to lower addresses
dest += count - 1;
source += count - 1;
while (count--)
*dest-- = *source--; // 情况同上
}
return ret;
}
***********************正确的如下**************************
void* mymemcpy(void* dest, void* source, size_t count)
{
char *ret = (char *)dest;
char *dest_t = ret;
char *source_t = (char *)source;
while (count--){
*dest_t++ = *source_t++;
}
return ret;
}
void *my_memmove(void *dst,const void *src,int count)
{
char *ret;
char *dst_t;
char *src_t;
ret = (char *)dst;
if ((unsigned char*)dst = (unsigned char*)src
|| (unsigned char *)dst = ((unsigned char *)src + count))
{
dst_t = (char *)dst;
src_t = (char *)src;
while (count--)
{
*dst_t++ = *src_t++;
}
}else{
dst_t = (char *)dst + count - 1;
src_t = (char *)src + count - 1;
while (count--)
{
*dst_t-- = *src_t--;
}
}
return(ret);
}
您可能关注的文档
- JAVA面试题(华为)(答案).docx
- Java面试题库(冯朝阳).doc
- java验证码的用法.doc
- jaxws,jaxrs规范的webservice客户端调用方式及soap安全验证.doc
- jbosscluster环境的安装与配置.doc
- JBoss安装加固及日志分析.pdf
- JCPNet Tool and Automated Analysis of Distributed Systems ABSTRACT.pdf
- JDBC中,如果ResultSet和Statement不关闭的话,会有什么影响.doc
- JBOSS常见问题.docx
- jdbc知识点.doc
- Memorandum of Understanding Between The Ministry of Economics in Santiage And The Ministry of Econom.doc
- Mel在三套骨骼相互转换时的应用.doc
- Memorybased onestep namedentity recognition Effects of seed list features, classifier st.pdf
- Merit Review Broader Impacts Criterion Representative Activities.pdf
- MetalFerroelectricMetal heterostructures with Schottky contacts I. Influence of the ferro.pdf
- Methods of Setting Maximum Speed Limits on Freeways(高速公路最高车速限制的设置方法).pdf
- Method for Comprehensive Evaluation.pdf
- Metric Suite for Directing the Failure Mode Analysis of Embedded Software Systems.pdf
- MFC中滑动条的使用.doc
- MFC中MSChart的使用示例.pdf
文档评论(0)