memcpy memmove 区别

 

memcpy memmove 区别

memcpy 和memmove 都是把一个内存块拷贝到另一个内存块,其区别为:

 

memcpy 不考虑源内存块和 目标内存块 是否重叠的情况,即

       source  |                                |

                           dest |                               |

 

而memmove则考虑了这一情况,当遇到这种情况的时候,拷贝是从最高位开始,这样就保证source中还没拷贝的块不会因为dest的原因被修改。

 

C代码

#include <stdio.h>  

  1. #include <stdlib.h>  
  2. #include <assert.h>  
  3.   
  4. /** 
  5. *mymemcpy 把source 复制到dest, 返回dest的头指针, count 是指针长度 
  6. **/  
  7. void * mymemcpy(void * dest, const void * source, size_t count)  
  8. {  
  9.     assert(dest != NULL || source != NULL);  
  10.     void * ret = dest; //记录dest初始地址  
  11.     while(count--)  
  12.     {  
  13.         *(char *)dest = *(char *)source;  
  14.         //*dest = *source;  void * 只知道所指内容的起始地址,不知道所指内容的大小(占几个字节),所以无法正确引用  
  15.         dest = (char *)dest + 1;  
  16.         source =(char *)source + 1;  
  17.     }  
  18.     return ret;  
  19. }  
  20.   
  21.   
  22. /**  
  23. * memcpy 没有考虑当source 和dest 有以下内存地址重叠的情况:  
  24. *                source |         |  
  25. *                           dest|        |  
  26. *  即source向dest复制的时候,会改变source后面需要复制的内容。  
  27. *  解决办法,当这种情况出现时,可以考虑从最高位向最低位复制。  
  28. **/  
  29. void * mymemmove(void * dest, const void * source, size_t count)  
  30. {  
  31.     assert(dest != NULL || source != NULL);  
  32.   
  33.     void * ret = dest;  
  34.   
  35.     if(dest < source || dest > (char *) source + count -1) //不会出现重叠情况  
  36.     {  
  37.         while(count--)  
  38.         {  
  39.             *(char *) dest = * (char *) source;  
  40.             dest = (char *)dest + 1;  
  41.             source = (char *)source + 1;  
  42.         }  
  43.     }  
  44.     else  
  45.     {  
  46.         while(count--)  
  47.         {  
  48.             *((char *) dest + count) = *((char *) source + count );  
  49.         }  
  50.     }  
  51.     return ret;  
  52. }  
  53.   
  54. int main()  
  55. {  
  56.     char a[] = "abcdefgh";  
  57.       //mymemcpy(a+2, a, 4);  
  58.     mymemmove(a+2, a, 4);  
  59.   
  60.     printf("%s\n",a);  
  61.   
  62.     return 0;  

    

你可能感兴趣的:(c,null)