본문 바로가기
카테고리 없음

메모리 함수관련구현(memcpy,memset,memmove)

by ByteBridge 2013. 2. 20.
반응형

#include<iostream>
using namespace std;
void *Mymemcpy(void *dest,const void *src,unsigned int len);
//-> src번지에 있는 데이터를 dest가 지정하는 번지로  len 바이트만큼 복사(메모리끼리 복사)
void *Mymemset(void *src,int c,unsigned int n);
//-> src 가 포인트 하는 메모리를 값 c로 n개를 채운다,리턴값 src의 포인터
//-> src 채울 대상이 되는 메모리,c 채울값,int 형이지만 1바이트(char)로 인식,n 채울 개수 
//memset 함수란 : 메모리의 일정한 크기의 블럭을 사용자에 의해 정해진 값으로 채우는 함수임
void *Mymemmove(void *dest,const void *src,unsigned int n);
//->dest 복사 대상메모리,src 복사원 메모리,n 복사할 길이 
//메모리끼리 복사함 , src번지에 있는 데이터를  dest 가 지정하는 번지로 n바이트만큼 복사,
//리턴값 dest 의 번지를 리턴한다. 에러발생시 null 리턴 
//메모리가 겹쳐있어도 복사는 정확하게 수행
// 배열의 요소들을 다른 배열로 옮길시 아주 유용함,
//이함수를 사용하지않을경우 다른 배열을선언하여 다시 복사해서 넣어줘야함
//이럴때 유용한 함수가 memmove 임
//////////////////////////////////////////////////////////////
/-
memcpy: 메모리 앞에서부터 복사
memmove: 메모리 뒤에서부터 복사
*-
int main(void)
{
char src[]="지하철";
char dest[]="서울게임";
//만든함수
char *ptr=(char*)Mymemcpy(dest,src,2);//--> src 메모리의 '지'를 dest의 '서'영역에 복사
cout<<ptr<<endl;
//제공함수
char *ptr1 = (char*)memcpy(dest,src,strlen(src));
cout<<ptr1<<endl;
///memset 테스트 
char tmp[10];
//만든함수
Mymemset(tmp,'g',10);
for (int i=0;i<10;i++)
{
cout<<tmp[i]<<" ";
}
cout<<endl;
//제공함수
char tmp1[10];
memset(tmp1,'a',10);
for (int i=0;i<10;i++)
{
cout<<tmp1[i]<<" ";
}
cout<<endl;
///memmove 테스트 
//만든함수 
char str[7] = "abcdef";
Mymemmove(str+2,str,4);
cout<<str<<endl;
//제공함수
char str1[7]="abcdef";
memmove(str1+2,str1,4);
cout<<str1<<endl;
return 0;
}
//-> src영역에서 len 크기만큼 dest의 처음부터 src의 메모리영역에 있는 데이터를 복사함
void *Mymemcpy(void *dest,const void *src,unsigned int len)
{
char *pdest =(char*)dest;
const char *psrc = (char*)src;
while(len--)
{
*pdest++ = *psrc++;
}
return dest;
}
void *Mymemset(void *src,int c,unsigned int n)
{
char* psrc = (char*)src;
while(n--)
{
psrc[n] = c;
}
return src;
}
void *Mymemmove(void *dest,const void *src,unsigned  n)
{
 char *pdest = (char*)dest;
 const char *psrc = (char*)src;
if (pdest <= psrc || psrc >=(pdest+n))//겹치는지 검사
{
//겹치지않을시  memcpy함수처럼 앞에서부터 복사
while (n--)
{
*pdest++ = *psrc++;
}
}
else
{
//겹치면 뒤에서부터 복사(pdest와 psrc의 크길를 n만큼 확장한후
pdest = pdest+n -1;
psrc = psrc+n-1;
while (n--)
{
*pdest-- = *psrc--;
}
}
return dest;
}

반응형