[C,C++] memset, memcpy 함수 사용법!

mem- 이라는 접두사가 붙은 함수는 메모리 관련 함수라는 의미이다.

memset은 메모리를 초기화 하는 함수이고, memcpy는 메모리를 복사하는 함

수이다.

얼마전 sprintf() 로 512크기의 char배열의 값을 받아서 넣은 적이 있다..

그런데, 500크기일때 까지는 제대로 값이 들어와서 새로운 배열에 값이 잘 써졌

는데, 512가 되니... 이상하게 값이 짤리고, 날라가고 쓰레기 값이 들어왔다..

그래서 알아보니 크기가 큰 배열인 경우에 sprintf를 사용하면, 이렇게 값이 제

대로 안들어오는 경우가 종종 있다고 한다..

그래서 사용한 방법이 memcpy 이다.

그러니 정상적으로 복사가 되었다..

일단 먼저 memset 부터 알아보자..

void *  __cdecl memset(_Out_opt_bytecapcount_(_Size) void * _Dst, _In_ int _Val, _In_ size_t _Size);

이 것이 memset의 함수 원형이다.

1번 파라미터는 값을 복사할 곳이고, 2번 파라미터는 초기화할 값, 마지막은 얼

마만큼의 메모리를 초기화 할 것인지 하는 크기이다.

단, char 값이 아니라면, 0, -1로만 초기화 하는 것이 좋다.

(다른 값은 쓰레기 값이 들어가는 경우가 많다. )
---------------------------------------------------------------------
수정사항... 다른 분의 지적이 있으셔서 확인해보니.. 그 말이 맞아 수정합니다.

먼저.. 쓰레기 값이 들어가는 것이 아니라.. 1바이트 기준으로 값이 들어가기 때문에 char를 제외한 다른 1바이트가 넘는 (예를 들면 인트라면..) 변수에 값을 넣으면 그 바이트 수 만큼 모두 1 숫자로 초기화를 합니다.

int를 예로 들어보면 4바이트 모두를 1로 초기화 하기때문에 메모리가 각바이트가 모두 1로 초기화 되어있습니다. 원래 4바이트가 0000 이라면 0001 이 되어야 출력시 1로 표시되는데 1111이 되기 때문에 출력을 해보면 원하는 값이 들어 가지 않네요...

----------------------------------------------------------------------

 


위의 출력 창은 1로 memset 한 경우인데.. 다른 값이 들어가 있는 것을 확인

할 수 있다.

int test1[5] ;

memset( test1, 0, 5 * sizeof(int) ) ;

이렇게 사용하면되는데,  int 형의 크기가 5인 배열에 값을 0으로 초기화 하는

것이다.

다음은 memcpy 이다.

void *  __cdecl memcpy(_Out_opt_bytecapcount_(_Size) void * _Dst, _In_opt_bytecount_(_Size) const void * _Src, _In_ size_t _Size);

memcpy의 함수 원형이다.

첫번째 파라미터는, 역시 복사될 메모리 주소고, 다음은 복사할 메모리 주소,

마지막은, 복사할 사이즈다.

사용법은

int test1[5], test2[5] ;

memset( test1, 0, 5 * sizeof(int) ) ;
memset( test2, -1, 5 * sizeof(int) ) ;

memcpy( test1, test2, 5 * sizeof(int) ) ;

이러고 test1의 값을 차례로 출력하면 모두 -1로 변해 있는 것을 알 수 있다.


출력 결과 이다.

요즘은 잘 사용하지 않고 있다가, 이번에 sprintf 문제 때문에 다시 알아보게 되

었지만, 속도상의 이득도 많다고 한다.

긴 크기의 배열이나, 값은 이렇게 메모리 자체를 복사하여 쓰는 것이 훨씬 이득

이라고 하니, 앞으로 코딩할 때 많이 고려해 봐야할 것 같다.

[C,C++] memset, memcpy 함수 사용법!


Posted by 바람처럼..
|