Monday, November 12, 2012

memcpy() and memmove()




                                                    memcpy() and memmove()


memcpy does a mindless copy, regardless of whether there are shared bytes between the source and destination: 

 void *memcpy (void *dst, const void *src, size_t n)

 { 

   char *a = dst;

   const char *b = src; 

   while (n--)


    *a++ = *b++;



       }

   return dst;


 }



memmove does backward copy  and takes care of overwritten value of shared bytes:


void *memmove(void *dst, const void *src, size_t n) 

{ 

 char *a = dst; 

 const char *b = src;



 if (a <= b || b >= (a + n)) {

/* No overlap, use memcpy logic or can use memcpy itself(copy forward) */ 

 while (n--) 

 *a++ = *b++;


}


else { 

 /* Overlap! Copy backward to fix */ 

 a = a + n - 1; 

 b = b + n - 1;




while (n--) 

 *a-- = *b--; 

 } 

 return dst;

No comments:

Post a Comment