Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2697400
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: C/C++

2014-07-23 16:17:33


http://blog.csdn.net/lxgwm2008/article/details/11952285

一直以来知道memcpy函数有问题,没有处理内存重叠的情况;而memmove函数对这种情况进行了处理。今天碰巧有同事问到,特地翻了一下源码,了解一下实现方法,大体如下:


  1. void *memcpy(void *dst, const void *src, size_t len)  
  2. {  
  3.     if(NULL == dst || NULL == src){  
  4.         return NULL;  
  5.     }  
  6.       
  7.     void *ret = dst;  
  8.       
  9.     if(dst <= src || (char *)dst >= (char *)src + len){  
  10.         //没有内存重叠,从低地址开始复制  
  11.         while(len--){  
  12.             *(char *)dst = *(char *)src;  
  13.             dst = (char *)dst + 1;  
  14.             src = (char *)src + 1;  
  15.         }  
  16.     }else{  
  17.         //有内存重叠,从高地址开始复制  
  18.         src = (char *)src + len - 1;  
  19.         dst = (char *)dst + len - 1;  
  20.         while(len--){  
  21.             *(char *)dst = *(char *)src;  
  22.             dst = (char *)dst - 1;  
  23.             src = (char *)src - 1;  
  24.         }  
  25.     }  
  26.     return ret;  
  27. }  

从注释可以看出,当有内存重叠是,拷贝是倒序进行的。


特此记录,以备忘。

阅读(528) | 评论(0) | 转发(0) |
0

上一篇:memcpy源代码

下一篇:链表常见面试题

给主人留下些什么吧!~~