memcpy 와 memmove 에 대한 중요 한 설명

2862 단어 memcpymemmove
오늘 책 에서 memcpy 와 memmove 의 차 이 를 보고 나 서 야 갑자기 둘 사이 에 이런 차이 가 있다 는 것 을 알 게 되 었 다.예전 에는 이 두 함수 만 알 고 있 었 다.
같은 기능 을 실현 하고 그 차이 점 을 접 하지 못 했다.
memcpy 와 memmove 는 MSDN 에서 다음 과 같이 정의 합 니 다.


양자 의 성명 을 보면 확실히 차이 가 없다.우 리 는 이런 예 를 보 자.
char*src="abcde"라 는 문자열 을 모두 dest 에 복사 해 야 할 때 src 와 dest 는 메모리 에 이렇게 존재 합 니 다.
메모리 주소   낮다

src   dest
1  2  3  4  5   6
[ a ][ b ][ c ][ d ][ e ][ '\0' ][ ][ ][ ][ ][ ][ ][ ]
src 주 소 는 메모리 1 이 고 목적 주 소 는 메모리 2 입 니 다.이때 메모리 가 중첩 되 었 습 니 다.우리 가 문자 a 를 세 번 째 메모리 위치 로 복사 할 때
a.src 메모리 의 세 번 째 문 자 를 덮어 씁 니 다.
해결 방법,dest 주 소 를 dest+n-1 로 이동 하 는 동시에 src 주 소 를 src+n-1 로 이동 한 다음 src 의 마지막 요소 에서 열 려 고 합 니 다.
dest 에 하나씩 복사 하면 메모리 중첩 으로 인 한 요소 덮어 쓰기 문 제 를 완벽 하 게 피 할 수 있 습 니 다.
다음은 memcpy 와 memmove 에 따라 자신의 실현 을 보 여 드 리 겠 습 니 다.

#include <iostream>
using namespace std;

void *memcopy( void *dest, const void *src, size_t count )
{
  if(dest==NULL||src==NULL)
    return NULL;
  char* Dest=(char*)dest;
  const char* Src=(char*)src;
  
  int i=0;
  
  while(i<count)
  {
    *Dest++=*Src++;
    i++;
  }
  
  return dest;
}

void *memmove(void *dest,const void *src,size_t count )
{
  if(dest==NULL||src==NULL)
    return NULL;

  char* Dest=(char*)dest;
  const char* Src=(char*)src;
  
  int i=0;
  if(src>dest)
  {
    while(i<count)//    
    {
      *Dest++=*Src++;
      i++;
    }
  }
  else
  {
    Dest=Dest+count-1;//    
    Src=Src+count-1;

    while(i<count)
    {
      *Dest--=*Src--;
      i--;
    }
  }

  
  
  return dest;
}



void main()
{
  char dest[80];
  memset(dest,'\0',80);
  char* src="memcpyteststring";
  int n;
  cout<<"How many char you want to copy from src to dest(memcpy): ";
  cin>>n;
  cout<<"The dest string is: "<<(char*)memcopy(dest,src,n)<<endl;
  cout<<"How many char you want to copy from src to dest(memcpy): ";
  cin>>n;
  cout<<"The dest string is: "<<(char*)memmove(dest,src,n)<<endl;
  return;
}
캡 처 실행:

이상 은 바로 여러분 께 가 져 온 memcpy 와 memmove 에 관 한 중요 한 설명 입 니 다.모든 내용 을 알려 드 리 겠 습 니 다.많은 응원 부 탁 드 리 겠 습 니 다~

좋은 웹페이지 즐겨찾기