Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330730
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1293
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-07 11:17
个人简介

爱运动,爱看书,爱生活!

文章分类

全部博文(73)

文章存档

2014年(7)

2013年(66)

分类: C/C++

2013-08-31 17:03:13

首先了解memcpy与memmove的不同
区别:memcpy(char *dest,char *src,n)不考虑内存重合问题,
从正向拷贝n个字节的内容,而且应该是一个字节一个字节的拷贝
memmove(char *dest,char *src,n)考虑内存重合,首先从src开始
找到第n个的字符,然后从后往前将这n个字符依次放入对应内存区域
实现:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. void *memcpy(void *dest,void *src,int n)
  3. {
  4.     if(dest==NULL || src==NULL)
  5.         return;
  6.     char *rev=(char*)dest;
  7.     while(n>0){
  8.         *(char*)dest=*(char*)src;
  9.         dest=(char*)dest+1;
  10.         src=(char*)src+1;
  11.         n--;
  12.     }
  13.     return rev;    
  14. }

  15. void *memmove(void *dest,void *src,int n)
  16. {
  17.     if(dest==NULL || src==NULL )
  18.         return;
  19.     char *pdest=(char*)dest;
  20.     char *psrc=(char*)src;
  21.     //内存没有重合或重合不影响正向copy
  22.     if(pdest<psrc || pdest>psrc+n){//将两个地址比较可以确定哪个地址空间大
  23.         while(n--){
  24.             *pdest=psrc;
  25.             pdest=pdest+1;
  26.             psrc=psrc+1;
  27.         }
  28.     }
  29.      //两段内存空间有重合,从后往前copy。
  30.     else{
  31.         psrc=psrc+n-1;
  32.         pdest=pdest+n-1;
  33.         while(n--){
  34.             *pdest=*psrc;
  35.             pdest=pdest-1;
  36.             psrc=psrc-1;
  37.         }    
  38.      }
  39.     return dest;
  40. }
  41. int main()
  42. {
  43.     int i;
  44.     int a[10];
  45.     for(i=0;i<10;i++){
  46.         a[i]=i;
  47.     }
  48. //    memcpy(&a[3],a,7*sizeof(int));
  49.     memmove(&a[3],a,7*sizeof(int));
  50.     
  51.     for(i=0;i<10;i++){
  52.         printf("%d ",a[i]);
  53.     }
  54.     printf("\n");
  55.     return 0;
  56. }

阅读(2066) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~