[C/C++] memset을 올바르게 사용하기
memset 함수를 사용하게 되면, 일반적인 for문을 이용하여 초기화할 때보다
속도상의 이점이 있기 때문에 배열을 초기화할 때 자주 사용하게 된다.
그런데, memset을 사용할 때 초기화할 값을 넣을 때는 조심해야한다.
void *memset( void *dest, int ch, size_t count );
값에 대한 타입이 int 형이지만, 기본적으로 내부에서 1byte 에 해당하는 단위로 초기화를 진행한다.
예를 들어서,
int n;
memset(&n, 1, sizeof(int));
cout << n;
위와 같이 사용한 경우, 출력 값이 16843009가 나온다.
cout << (short)n;
위의 출력 값은 257이 나온다.
이 출력 값들을 이진수로 변환하여 분석해보자.
16843009 => 1000000010000000100000001
257 => 100000001
위를 최하위 비트부터 8개씩 끊으면, 1byte가 된다.
1 00000001 00000001 00000001
1 00000001
즉, 내부적으로 1byte에 해당하는 단위로 초기화를 진행하는 것을 볼 수 있다.
우리가 원했던 것은 int 형의 변수 n에 1이라는 정수형 값으로 초기화하는 것이다.
그런데 int 형은 4byte이므로, 4byte가 하나의 단위로 보고
최하위 비트에 1을 쓰고, 나머지 비트 31개를 0으로 초기화해야 하는데,
memset 함수는 그러지 않고 1byte를 하나의 단위로 보고 초기화를 진행했던 것이다.
이러한 이유로 검색을 해보면, memset에 초기화할 때는 0을 쓰라고 권유한다.
0의 경우에는 어떠한 단위로 진행해도, 모든 비트에 숫자가 0이기 때문에 올바른 결과가 나오기 때문이다.
그러나 0 이외에 부분적으로 가능한 숫자가 있다. 바로 -1이다.
-1의 경우에도 0처럼 모든 비트에 숫자가 1이기 때문이다.
memset(&n, -1, sizeof(int));
이렇게 사용해도 올바른 결과가 나온다.
단, 위에서 부분적이라고 했던 이유는 unsigned int 형과 같은 부호없는 정수형의 경우에는
올바른 결과값을 기대할 수 없기 때문이다.
댓글
댓글 쓰기