메모리를 할당받은 변수의 공간은 쓰레기 값들이 남아있습니다. 이러한 쓰레기값들을 없애기 위해서 사용할 수 있는 방법중 하나가 memset함수를 사용하는 것입니다. memset 함수를 사용하면 메모리의 내용을 원하는 크기만큼 특정값으로 설정할 수 있습니다. 특히 동적이나 정적으로 생성한 배열을 초기화할 때 자주 사용합니다.
memset 함수 사용법
#include <string.h> //C언어
#include <cstring.h> //C++
void* memset(void* ptr, int value, size_t num);
memset함수를 사용하기 위해서는 먼저 memset함수가 포함되어 있는 헤더를 포함시켜야 합니다. 헤더는 string.h에도 있고, memory.h에도 memset함수가 있습니다. 둘중 아무거나 포함해 주세요.
인자 값
ptr : 메모리의 크기를 변경할 포인터
value : 초기화 값
size : 초기화 크기 반환 값
반환 값
성공 시 ptr을 반환하고, 실패 시 NULL을 반환
memset 함수 사용 예제
#include<stdio.h>
#include<string.h>
int main() {
int arr[5];
for (int i = 0; i < 5; i++) {
printf("[%d]", *(arr + i)); //배열에 쓰레기값이 남아있음
}
printf("\n");
memset(arr, 0, sizeof(int) * 5); //크기 5 만큼 0으로 초기화
for (int i = 0; i < 5; i++) {
printf("[%d]", *(arr + i));
}
printf("\n");
return 0;
}
memset함수를 사용하면 위처럼 메모리값을 원하는 크기만큼 특정값으로 초기화시켜줄 수 있습니다.
memset 함수 사용 시 주의점
#include<stdio.h>
#include<string.h>
int main() {
int arr[5];
for (int i = 0; i < 5; i++) {
printf("[%d]", *(arr + i)); //배열에 쓰레기값이 남아있음
}
printf("\n");
memset(arr, 1, sizeof(int) * 5); //크기 5 만큼 1로 초기화
for (int i = 0; i < 5; i++) {
printf("[%d]", *(arr + i));
}
printf("\n");
return 0;
}
위의 예제를 그대로 memset함수에 0을 1로 변경해보니 위와 같은 결과가 나왔습니다. 1로 초기화를 시켜줄 목적으로 사용했는데 왜 1로 초기화되지 않고 16843009라는 값이 나오게 되었을까요?
memset() 함수의 두번째 인자 값 value은 정수 형태로 함수에 넘겨주지만 실질적으로 memset 함수 안에서 이 value값을 unsigned char로 바꿔서 메모리 블록을 다루게 되어 이상한 값이 출력된것인데 int형은 4bytes이고 unsigned char은 1bytes이므로 int형 상수 1은 위의 그림과 같이 8bits 단위로 1로 초기화됩니다. 그러므로 배열 내 모든 값들이 16843009로 초기화된 것입니다. 따라서 memset() 함수를 초기화를 목적으로 사용할 때는 반드시 0 혹은 NULL 값만 사용하도록 합시다.
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] 메모리 이동 memmove 함수 사용법 & 예제 (0) | 2021.02.12 |
---|---|
[C언어/C++] 메모리 복사 memcpy 함수 사용법 & 예제 (0) | 2021.02.11 |
[C언어] 동적 배열 생성하기 (1차원, 2차원) (1) | 2021.02.10 |
[C언어] 메모리 동적할당 (malloc, free) 함수 사용법 & 예제 (3) | 2021.02.09 |