Memcpy 함수 구현 - Memcpy hamsu guhyeon

이미 생성한 객체들을 여러개 만들어야 할때 물론 여러번 만들어줄수도 있지만 번거로울 수 있습니다. 이런 경우에는 이미 만들어 놓은 객체들을 복사해서 사용하면 편리한데요. memcpy함수를 사용하여 메모리를 다른곳으로 복사할 수 있습니다. 이번 포스팅에서는 memcpy함수의 사용법에 대해 알아보도록 하겠습니다.

memcpy 함수 사용법

#include <string.h>  //C언어
#include <cstring.h> //C++

void* memcpy (void* dest, const void* source, size_t num)

memcpy함수를 사용하기 위해서는 먼저 memcpy함수가 포함되어 있는 헤더를 포함시켜야 합니다. 헤더는 string.h에도 있고, memory.h에도 memcpy함수가 있습니다. 둘중 아무거나 포함해 주세요.

인자값
dest : 데이터가 복사될 곳을 가리키는 포인터
source : 복사할 데이터가 있는 위치를 가리키는 포인터
num : 복사할 바이트 수

리턴값
dest가 리턴됨

memcpy 함수 사용 예제

#include <string.h>
#include <stdio.h>

void main()
{
    char source[32] = "복사 대상 메모리";
    char dest[32] = "복사 될 메모리";

    printf("복사 전 : %s\n", dest);

    //src 메모리를 sizeof(src) 만큼 dest로 복사
    memcpy(dest, source, sizeof(source));

    printf("복사 후 : %s\n", dest);
}
Memcpy 함수 구현 - Memcpy hamsu guhyeon

위와 같이 memcpy함수를 사용하여 메모리를 다른곳으로 복사할 수 있습니다. 위의 예제에서는 문자열을 복사하였는데요. 문자열을 복사할때는 주의하실점이 몇가지 있습니다.

1.복사 될 char배열의 크기가 충분한가?

2.\0문자까지 복사가 되었는가?

문자열을 복사할때는 위의 두가지를 꼭 체크해주시기 바랍니다. 복사될 문자열 크기가 복사될 문자열보다 크기가 작다면 제대로 복사가 되지 않을것이고 또한 복사될 크기에 일부의 크기만 넣는다면 \0문자가 복사되지 않아 문자열이 깨질수도 있습니다. 문자열을 복사할때는 꼭 sizeof()함수를 사용하여 길이를 넣어주도록 합시다. 만약 문자열의 일부분만 복사하고싶다면 마지막에 \0문자를 강제로 넣어주셔야 합니다.

인터넷에서 한 문제를 보았는데 하나의memcpy 함수를 실현했다. 그래서memcpy의 함수 원형을 찾아봤다. 다음과 같다.

void* memcpy(char *strDest, const char *strSrc, int Count)
{
    if(strDest == NULL || strSrc == NULL || Count <= 0) return NULL;
    unsigned char *tempDest;
    unsigned char *tempSrc;
    tempDest = (unsigned char *)tempDest;
    tempSrc = (unsigned char *)tempSrc;
    while(Count--)
    {
        *tempDest = *tempSrc;
        tempDest++;
        tempSrc++;
    }
    return strDest;
}

이 함수 원형 구현에는 두 가지 문제가 고려되지 않았습니다.
1. strDest와 strSrc 메모리가 덮어쓰는 문제.
2. Count의 크기 문제. 정상적이라면 Count의 크기는strSrc가 가리키는 자원의 크기보다 크고 strDest가 가리키는 자원의 크기보다 작아야 한다.

  문제 1의 해결 방법은 다음과 같습니다.

void my_memcpy(void *dst,const void *src,size_t num){
      //assert((dst!=NULL) && (src!=NULL) && (num>=0))
      if(dst==NULL || src==NULL || num<0)
          return;
      if(dst==src)
          return;
      // convert to char type
      char* pdst=(char*)dst;
      const char* psrc=(const char*)src;
      // memory overlap
      if(pdst>psrc && pdst<psrc+num){
          for(int i=num-1;i>=0;i--)
              pdst[i]=psrc[i];
      }
      else{
          for(size_t i=0;i<num;i++)
              pdst[i]=psrc[i];
      }
  }

만들어보기 2018. 7. 21. 16:48 by 고기멍멍

메모리를 복사하는 함수인 memcpy를 구현해 보았다.

void Mymemcpy(void* _DesPIntArr, const void* _NowPIntArr, const int size)

{

    //1바이트로 변환.

    char* desArr = (char*)_DesPIntArr;

    char* nowArr = (char*)_NowPIntArr;

    //반복한다 횟수만큼

    for (int i = 0; i < size++i)

    {

        desArr[i] = nowArr[i];

    }

}

cs

옮길 목적지 주소, 데이터가 있는 메모리의 주소, 복사할 크기(바이트) 이 3가지 매개변수를 받는다. 

받아온 주소를 1바이트 형식의 char로 캐스팅 하고 복사할 크기만큼 반복문을 반복한다.

예시