ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 memset(), memcpy(), memmove()
    Visual Studio/C 기초 2013. 9. 13. 18:08

    이번에는 메모리 블록을 다루는 방법을 구체적으로 포스팅하겠습니다.

    지금까지 메모리의 블록을 할당하고 해제하는 방법을 살펴 보았습니다.

    먼저, 메모리의 블록에서 모든 바이트를 특정 값으로 설정하기 위해서 memset() 함수를 사용합니다.

    void *memset(void *dest, int c, size_t count); 

    인수 dest는 메모리 블록을 가리킵니다. c는 설정할 값이고 count는 dest에서 시작하는 대상 메모리 블록의 바이트 수입니다.

    c는 int형이지만 char형으로 취급이 됩니다. 즉, 하위 바이트만이 사용되므로 0부터 255까지의 c값을 지정할 수 있습니다.

     

    다음은 memcpy() 함수인데요, 이 함수는 가끔 버퍼라고 하는 메모리 블록간에 데이터의 바이트를 복사합니다. 이 함수는 복사되는 데이터 형에 대해 신경 쓰지 않습니다.

     void *memcpy(void *dest, void *src, size_t count);

    인수 dest와 src는 각각 대상과 원본 메모리 블록을 가리킵니다. count는 복사할 바이트 수를 지정합니다. 반환값은 dest고, 만약 메모리의 두 블록이 겹치는 함수는 정상적으로 동작하지 않을 것입니다.

    src의 일부 데이터는 복사되기 전에 겹처질 수 있습니다.

    이 상황을 해결하기 위해 memmove() 함수를 사용합니다. 이 함수는 한 메모리 블록에서 다른 곳으로 일정량의 바이트를 복사하므로 memcpy() 함수와 매우 비슷합니다. 그러나 이 함수는 메모리 블록이 겹치는경우를 적절히 다루므로 훨씬 더 유용합니다.

    memmove() 함수는 블록을 덮어쓰게 되는 상황을 다룰 수 있으면서 memcpy()와 똑같은 기능을 갖추고 있습니다.

     void *memmove(void *dest, void *src, size_t count);

    dest와 src는 대상과 원본 메모리 블록을 가리키고 count는 복사할 바이트 수를 지정합니다. 반환 값은 dest입니다.

    만약 블록이 겹치면 함수는 겹치는 영역의 원본 데이터를 덮어쓰기 전에 정확히 복사해둡니다.

    이제 예제를 보겠습니다.

     

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

    char message1[60] = "no pains, no gains.";
    char message2[60] = "abcdefghijklmnopqrstuvwxyz";
    char temp[60];

    main()
    {
     printf("memset() 사용 이전의 message1[] :\t%s\n", message1);
     memset(message1+5,'@',10);
     printf("memset() 사용 이후의 message1[] :\t%s\n", message1);

     strcpy(temp, message2);
     printf("원본 메시지 : %s\n", temp);
     memcpy(temp+4, temp+16, 10);
     printf("오버랩 없이 memcpy() 사용 이전 : \t%s\n", temp);
     strcpy(temp, message2);
     memcpy(temp+6, temp+4, 10);
     printf("오버랩을 포함한 memcpy() 사용 이후 : \t%s\n", temp);

     strcpy(temp, message2);
     printf("원본 메시지 : %s\n", temp);
     memmove(temp+4, temp+16, 10);
     printf("오버랩 없이 memmove() 사용 이전 : \t%s\n", temp);
     strcpy(temp, message2);
     memmove(temp+6, temp+4, 10);
     printf("오버랩을 포함한 memmove() 사용 이후 : \t%s\n", temp);

     

     

    'Visual Studio > C 기초' 카테고리의 다른 글

    int argc, char *argv[]  (0) 2013.10.06
    C언어 시프트 연산자  (0) 2013.10.01
    C언어 free()  (0) 2013.09.13
    C언어 realloc()  (0) 2013.09.11
    C언어 calloc()  (0) 2013.09.10

    댓글

Designed by Tistory.