memcpy와memmove

5421 단어
Technorati 태그:memcpy,memmove
먼저 man의 결과를 봅시다.
NAME       memcpy - copy memory area
SYNOPSIS       #include
       void *memcpy(void *dest, const void *src, size_t n);
DESCRIPTION       The  memcpy()  function  copies  n bytes from memory area src to memory       area dest.  The memory areas should not overlap.  Use memmove(3) if the       memory areas do overlap.
 
NAME       memmove - copy memory area
SYNOPSIS       #include
       void *memmove(void *dest, const void *src, size_t n);
DESCRIPTION       The  memmove()  function  copies n bytes from memory area src to memory       area dest.  The memory areas may overlap: copying takes place as though       the  bytes in src are first copied into a temporary array that does not       overlap src or dest, and the bytes are then copied from  the  temporary       array to dest.두 가지 가장 큰 차이점은 src와dest 구역이 중첩된 상황을 볼 수 있으며, 중첩될 때memmove를 사용할 수 있다.
 
먼저 memcpy 코드를 보십시오.
   1: void *memcpy(void *dest, const void *src, size_t n)
   2: {
   3:     void* ret = dest;
   4:  
   5:     // 
   6:     while (n--)
   7:     {
   8:         *(char*)(dest++) = *(char*)(src++);
   9:     }
  10:  
  11:     return ret;
  12: }

겹치는 경우:
1.dest 주소는 src보다 낮고 중첩되지 않는memcpy와 유사합니다. 예를 들어 다음과 같습니다.
   1: char a[] = "helloworld";
   2: printf("%s
"
, a);
   3: memcpy(a, a+2, 3);
   4: printf("%s
"
, a);

a[2]부터 세 글자를 복사하고 a[0]에서 순서대로 내려놓으세요.
출력:lloloworld
2.src 주소는dest 주소보다 낮고memcpy 방식으로 복사하면 오류가 발생합니다. 예를 들어 다음과 같습니다.
   1: char a[] = "helloworld";
   2: printf("%s
"
, a);
   3: memcpy(a+2, a, 3);
   4: printf("%s
"
, a);

원래 뜻은 a[0]부터 세 글자를 복사하고 a[2]에서 순서대로 내려놓으면 hehelworld
하지만 출력: hehehworld
올바른 코드:
   1: void *memmove(void* dest, const void *src, size_t n)
   2: {
   3:     void* ret = dest;
   4:  
   5:     if (dest<=src || (char*)dest>= ((char*)src + n))
   6:     {
   7:         // dest src, 
   8:         while (n--)
   9:         {
  10:             *(char*)(dest++) = *(char*)(src++);
  11:         }
  12:     }
  13:     else
  14:     {
  15:         //src dest 
  16:         // ,dest src 
  17:         // 
  18:         dest = (char*)dest + n - 1;
  19:         src  = (char*)src  + n - 1;
  20:         while (n--)
  21:         {
  22:             *(char*)(dest--) = *(char*)(src--);
  23:         }
  24:     }
  25:  
  26:     return ret;
  27: }

이렇게 memove(a+2, a, 3)를 호출하는 것이 옳다.
출력:hehelworld

좋은 웹페이지 즐겨찾기