728x90
반응형



자주 쓰이는 메모리 함수 정리




* memset



메모리 블록을 채운다. ptr로 시작하는 메모리 주소로부터 num 개의 바이트를 value 값으로 채운다. 


이 때 value는 unsigned char 로 형변환 된다. 


#include <string.h> // C++ 에서는 <cstring>

void * memset ( void * ptr, int value, size_t num );


memset 예제


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

int main ()
{
    char str[] = "almost every programmer should know memset!";
    memset (str,'-',6);
    puts (str);
    return 0;
}


실행 결과 


------ every programmer should know memset!










* memmove


memmove(복사받을 메모리공간, 복사할 메모리공간, 메모리공간 크기)


복사 받을 메모리 공간에 복사할 메모리 공간을 복사할 크기만큼 복사한다.

void * memmove ( void * destination, const void * source, size_t num );


memmove 예제 1

#include <stdio.h>
using namespace std;
int main ()
{
    int test1[10] = {0, 0, 0};
    int test2[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    memmove(test1, test2, 5 * sizeof(int)); // test2를 test1에 복사

    cout << test1[1] << endl;
    cout << test1[5] << endl;
}


실행 결과 


1

0



memmove 예제 2


/* memmove example */
#include <stdio.h>
#include <string.h>
int main ()
{
  char str[] = "memmove can be very useful......";
  memmove (str+20,str+15,11);
  puts (str);
  return 0;
}


실행 결과


memmove can be very very useful.











* memcpy


memcpy(복사받을 메모리공간, 복사할 메모리공간, 메모리공간 크기)


복사할 메모리 공간의 값을 복사받을 메모리 공간에 메모리 공간 크기만큼 복사한다. 


void * memcpy ( void * destination, const void * source, size_t num );



memcpy 예제 1

#include <stdio.h>
using namespace std;
int main ()
{
    int test1[10] = {1, 1, 1, 1, 1, 1, 1, 1,1 , 1};
    int test2[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    memmove(test1, test2, 10 * sizeof(int)); // test2를 test1에 복사

    cout << test2[1] << endl;
    cout << test1[1] << endl;
}


실행 결과 


1

1




memcpy 예제 2


/* memcpy example */
#include <stdio.h>
#include <string.h>

struct {
  char name[40];
  int age;
} person, person_copy;

int main ()
{
  char myname[] = "Pierre de Fermat";

  /* using memcpy to copy string: */
  memcpy ( person.name, myname, strlen(myname)+1 );
  person.age = 46;

  /* using memcpy to copy structure: */
  memcpy ( &person_copy, &person, sizeof(person) );

  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );

  return 0;
}


실행 결과


person_copy: pierre de Fermat, 46












* memcpy 와 memmove 의 차이점



- memcpy는 메모리를 직접 복사하고, memmove는 임시 공간에 저장한 후 판단하여 다시 복사


- memmove가 memcpy에 비해 안정성이 높음


- memcpy는 memmove 보다 안정성이 떨어지지만, 임시 공간을 거치지 않고 바로 복사하기 때문에 속도가 빠름











* memcmp


메모리 공간을 비교하는 함수 


memcmp(비교할 값, 비교할 값, 데이터 개수)

int memcmp ( const void * ptr1, const void * ptr2, size_t num );


memcmp 예제 1


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

int main ()
{
    int arr1[10] = {1, 2, 3, 4, 5};
    int arr2[10] = {1, 2, 3, 4, 5};

    if(memcmp(arr1, arr2, 5) == 0)
        puts("arr1과 arr2는 일치!");
    else
        puts ("arr1과 arr2는 불일치!);

    return 0;
}

실행 결과


arr1과 arr2는 일치!



memcmp 예제 2


/* memcmp example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";

  int n;

  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );

  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  return 0;
}

실행 결과


'DWgaOtP12df0' is greater than 'DWGAOTP12DF0'.











* memchr


특정 문자 위치를 찾아주는 함수 


void * memchr ( const void *, int, size_t );


memchr 예제


/* memchr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char * pch;
  char str[] = "Example string";
  pch = (char*) memchr (str, 'p', strlen(str));
  if (pch!=NULL)
    printf ("'p' found at position %d.\n", pch-str+1);
  else
    printf ("'p' not found.\n");
  return 0;
}


실행결과


'p' found at position 5.










참고자료 1 : http://itguru.tistory.com/104


참고자료 2 : http://www.cplusplus.com/reference/cstring/memset/


참고자료 3 : http://metalkim.tistory.com/148


참고자료 4 : http://aossuper8.tistory.com/22





728x90
반응형

'Programming > C | C++' 카테고리의 다른 글

[C++] goto 문  (0) 2018.09.07
[C++] 조건부 연산자  (0) 2018.09.06
[C++] 반복자 (Iterator)  (0) 2018.09.04
[C++] 자료형의 종류와 범위 그리고 WORD 와 DWORD  (2) 2018.09.03
[C, C++] 프로그램 수행시간 측정  (0) 2018.09.03