[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 함수의 원리와 사용법을 예제와 함께 알아보았습니다.
오늘도 읽어주셔서 감사합니다.
댓글
댓글 쓰기