[C언어/C++] memset 함수 사용법과 예제 (배열 초기화, 문자열 변경)

안녕하세요. BlockDMask 입니다.

오늘은 C언어와 C++을 공부할 때 꼭 알아두어야 하는 기본 함수 중 하나인 memset 함수에 대해 알아보겠습니다. 배열 초기화나 메모리 영역을 특정 값으로 채울 때 매우 유용하게 쓰이는 함수입니다.

목차



✅ 1. memset 함수란?

memset 함수는 메모리의 내용을 특정 값으로 원하는 크기만큼 세팅할 수 있는 함수입니다.
함수 이름 자체도 직관적이죠: memory + set → 메모리를 세팅한다.

이제 함수 원형을 살펴보겠습니다.

void* memset(void* ptr, int value, size_t num);
  • ptr : 값을 세팅할 메모리의 시작 주소 (포인터)
  • value : 세팅할 값 (정수형으로 입력되나 내부적으로 unsigned char로 변환되어 저장됨)
  • num : 몇 바이트를 세팅할지 (바이트 단위)

주의: value 인자는 정수형이지만 unsigned char 로 변환되므로 'a' 같은 문자 리터럴도 사용할 수 있습니다.

보통 num길이 * sizeof(데이터타입) 형태로 작성합니다.

반환값은 세팅에 성공하면 ptr을 그대로 반환하고, 실패하면 NULL을 반환합니다.

헤더파일은 <memory.h> 또는 <string.h> 둘 다 사용할 수 있습니다.

간단 예제를 먼저 살펴보면:

char arr[] = "blockdmask";
memset(arr, 'c', 5 * sizeof(char));
printf("%s", arr);

위처럼:

  • 첫번째 인자: 초기화할 배열 arr
  • 두번째 인자: 초기화할 값 'c'
  • 세번째 인자: 초기화할 길이 5 * sizeof(char)

이제 본격적인 예제를 살펴보겠습니다.



✅ 2. 예제 1: 문자열 일부 변경

#include <string.h>
#include <stdio.h>

int main(void)
{
    char arr1[] = "blockdmask blog";
    memset(arr1, 'c', 5 * sizeof(char));
    printf("%s\n", arr1);
    return 0;
}

실행 결과:

cccccdmask blog

원래 문자열 "blockdmask blog"에서 앞부분 5글자가 'c'로 변경되었습니다.

※ 참고: C언어에서 문자열은 \0을 만날 때까지 출력되므로 뒤에는 기존 내용이 유지됩니다.



✅ 3. 예제 2: 배열 초기화 (for문 vs memset)

#include <memory.h>
#include <stdio.h>

void printAll(int* pArr, int len)
{
    for (int i = 0; i < len; ++i)
        printf("%d ", pArr[i]);
    printf("\n");
}

int main(void)
{
    // for문으로 초기화
    int arr1[20];
    for (int i = 0; i < 20; ++i)
        arr1[i] = 0;

    printf("for    : ");
    printAll(arr1, 20);

    // memset으로 초기화
    int arr2[20];
    memset(arr2, 0, 20 * sizeof(int));

    printf("memset : ");
    printAll(arr2, 20);

    return 0;
}

실행 결과:

for    : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
memset : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

설명:

배열을 0으로 초기화할 때 for문으로 하나씩 초기화할 수도 있지만, memset()을 사용하면 한 줄로 간편하게 초기화할 수 있습니다.



✅ 4. 예제 3: 주의사항 (0 외 값 세팅 시 문제)

#include <memory.h>
#include <string.h>
#include <stdio.h>

int main(void)
{
    int arr[5];
    
    memset(arr, 1, sizeof(arr));

    for (int i = 0; i < 5; ++i)
        printf("%d ", arr[i]);

    return 0;
}

실행 결과 (예시):

16843009 16843009 16843009 16843009 16843009

설명:

  • int형은 4바이트(32비트)인데 memset()은 1바이트 단위로 1 값을 반복해서 채웁니다.
  • 즉, 각 바이트에 0x01씩 채워져서 결과적으로 0x01010101이 되고, 10진수로는 16843009가 됩니다.

결론적으로:

  • 0을 넣을 때는 안전하게 동작합니다.
  • 그 외 값들은 int 타입에서 예상치 못한 결과가 나옵니다.

👉 따라서, memset()은 보통:

  • 문자열(char 배열) 초기화
  • 배열을 0으로 초기화할 때

이 두 가지 용도로 많이 사용됩니다.



이렇게 오늘은 C언어, C++에서 memset 함수의 원리와 사용법을 예제와 함께 알아보았습니다.
오늘도 읽어주셔서 감사합니다.

댓글

이 블로그의 인기 게시물

[Windows] 윈도우 CMD로 재부팅, 종료, 시간 설정하는 방법 (shutdown 명령어 정리)

[Python] 파이썬 주석 사용법 (한 줄 주석, 여러 줄 주석, 단축키, 들여쓰기 주의사항)

[Python] 파이썬에서 None, null, is None 차이 정리