ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메모리 함수관련구현(memcpy,memset,memmove)
    카테고리 없음 2013. 2. 20. 01:51
    반응형

    #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;
    }

    반응형
Designed by Tistory.