본문 바로가기

etc.

[C/C++] memset() 함수 사용과 주의점

반응형

C/C++ 언어에서 배열을 초기화할 때 memset() 함수를 종종 사용한다

다음 memset() 함수는 for문으로 초기화하는 것과 거의 같은 코드이다

 

char x[500];
memset (x, 0, sizeof(x));
char x[500];
for(int i=0 ; i<500 ; i++) x[i] = 0;

 

컴파일러에 따라 다를 수 있겠지만,

어셈블리어로 분석해봐도 같은 코드임을 알 수 있다

 

하지만 memset() 함수를 사용할 때 주의할 점이 있다

 


 

memset()은 두 번째 인자로 주어진 값을 주어진 메모리의 모든 바이트에 채운다

 

이 인자는 unsigned char(1바이트; 8비트)로 해석되기 때문에,

255보다 큰 정수값을 집어넣게 되면 오버플로우가 일어나게 된다

 

만약 배열이 32비트나 64비트 정수형이라면,

각 바이트마다 값이 들어가기 때문에 엉뚱한 수로 초기화될 수 있다

 

0이나 -1을 채울 수 있는 이유도

각 바이트에 해당 숫자를 집어넣고 부호 있는 정수형으로 해석하면

운 좋게도 해당 숫자와 같아지기 때문이다

 

따라서 memset()으로 배열을 초기화하는 방법은 제한적인 경우에만 쓸 수 있음을 주의해야 한다

반응형