C++의 memset() 함수란?
이 글에서는 C++에서 memset() 함수가 어떤 역할을 하는지 자세히 알아보겠습니다. memset() 함수는 주어진 문자 값을 unsigned char로 변환한 뒤, str[] 포인터가 가리키는 객체의 처음 n개 문자 각각에 해당 값을 복사합니다. 만약 n이 실제 문자열 크기보다 크다면 프로그램의 동작은 정의되지 않습니다(undefined).
memset() 함수 문법
void* memset( void* str, int c, size_t n);
- str: 값을 채워 넣을 대상 메모리 블록의 포인터
- c: 설정할 값 (unsigned char로 변환되어 저장됨)
- n: 채워 넣을 바이트 수
다음 예제에서는 하나의 문자열을 선언한 후, 앞에서부터 n개의 문자를 다른 문자로 변경해 보겠습니다.
예제 1: 문자열 일부 변경하기
#include<bits/stdc++.h>
using namespace std;
int main() {
char str[] = "Hello World";
memset(str, 'o', 6); // n = 6으로 지정
cout << str;
}
출력 결과
ooooooWorld
실행 결과를 보면 문자열 "Hello World"의 처음 6개 문자('H', 'e', 'l', 'l', 'o', 공백)가 모두 'o'로 변경된 것을 확인할 수 있습니다.
memset()으로 배열 초기화하기
memset()은 모든 값을 0 또는 -1로 초기화하는 데 매우 유용합니다. 하지만 그 외의 임의의 값으로는 초기화할 수 없는데, 그 이유는 memset()이 메모리를 바이트 단위로 처리하기 때문입니다.
예제 2: 정수 배열 초기화
#include<bits/stdc++.h>
using namespace std;
int main() {
int array[10];
memset(array, 0, sizeof(array));
for(int i = 0; i<10; i++){ cout << array[i] << " "; }
cout << endl;
memset(array, -1, sizeof(array));
for(int i = 0; i<10; i++){ cout << array[i] << " "; }
cout << endl;
memset(array, 3, sizeof(array));
for(int i = 0; i<10; i++){ cout << array[i] << " "; }
cout << endl;
}
출력 결과
0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027
왜 0과 -1만 제대로 동작할까?
일반적으로 int 타입은 4바이트이며, memset()은 각 바이트마다 동일한 값을 채워 넣습니다.
- 0으로 초기화: 모든 바이트가 0x00이 되므로, 4바이트 int 값도 그대로 0이 됩니다.
- -1로 초기화: 모든 바이트가 0xFF가 되며, 2의 보수 표현 방식에서 이는 정확히 -1을 의미합니다.
- 3으로 초기화: 각 바이트가 0x03으로 채워져 4바이트 int는 0x03030303, 즉 50529027이라는 전혀 다른 값이 됩니다.
따라서 memset()을 사용할 때는 0 또는 -1로 초기화하는 경우로 한정하는 것이 안전합니다. 그 외의 값으로 배열을 초기화해야 한다면 반복문이나 std::fill() 같은 대안을 사용하는 것이 좋습니다.