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 에 관 한 중요 한 설명 입 니 다.모든 내용 을 알려 드 리 겠 습 니 다.많은 응원 부 탁 드 리 겠 습 니 다~