자주 쓰이는 메모리 함수 정리
* 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
'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 |