现在的位置: 首页 > 综合 > 正文

C基础:memmove和memcpy的区别

2012年11月06日 ⁄ 综合 ⁄ 共 1792字 ⁄ 字号 评论关闭

1.memmove

函数原型:void *memmove(void *dest, const void *source, size_t count)

返回值说明:返回指向dest的void *指针

参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数

函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

  

 

2.memcpy

 

函数原型:void *memcpy(void *dest, const void *source, size_t count);

返回值说明:返回指向dest的void *指针

函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。

 

 

  1. void *MemCopy(void *dest,const void *src,size_t n)  
  2. {  
  3.     if(NULL == dest)  
  4.         return 0;  
  5.     if(NULL == src)  
  6.         return 0;  
  7.     char *pdest = (char*)dest;  
  8.     char *psrc = (char*)src;  
  9.     while(n--) //不对是否存在重叠区域进行判断  
  10.         *pdest++ = *psrc++; //*pdest++相当于*(pdest++)--先取*pdest,再pdest++  
  11.     return dest;  
  12. }  

   

 

3.两者区别

  函数memcpy()   从source  指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。   
  而memmove(),如果两函数重叠,赋值仍正确进行。

  memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy;   
  如果你不能保证是否有重叠,为了确保复制的正确性,必须用memmove

  1. void *MemMove(void *dest,const void *src,size_t n)  
  2. {  
  3.     if(n == 0)  
  4.         return 0;  
  5.     if(dest == NULL)  
  6.         return 0;  
  7.     if(src == NULL)  
  8.         return 0;  
  9.     char *psrc = (char*)src;  
  10.     char *pdest = (char*)dest;  
  11.     //检查是否有重叠问题  
  12.     if((dest <= psrc) || (pdest >= psrc+n))  
  13.     {     
  14.         //正向拷贝--Non-Overlapping Buffers copy from lower addresses to higher addresses    
  15.         for(int i=0;i<n;i++)  
  16.         {  
  17.             *pdest = *psrc;  
  18.             psrc++;  
  19.             pdest++;  
  20.         }  
  21.     }  
  22.     else  
  23.     {  
  24.         //反向拷贝--Overlapping Buffers copy from higher addresses to lower addresses     
  25.         psrc += n;  
  26.         pdest += n;  
  27.         for(int i=0;i<n;i++)  
  28.         {  
  29.             psrc--;  
  30.             pdest--;  
  31.             *pdest = *psrc;  
  32.         }  
  33.     }  
  34.     return dest;  
  35. }  

 

抱歉!评论已关闭.