Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ memset() 함수 완벽 가이드: 문법과 사용 예제

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() 같은 대안을 사용하는 것이 좋습니다.