[C언어/C++] 메모리 초기화 memset 함수 사용법 & 예제

메모리를 할당받은 변수의 공간은 쓰레기 값들이 남아있습니다. 이러한 쓰레기값들을 없애기 위해서 사용할 수 있는 방법중 하나가 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함수를 사용하면 위처럼 메모리값을 원하는 크기만큼 특정값으로 초기화시켜줄 수 있습니다.

 

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 주의점

위의 예제를 그대로 memset함수에 0을 1로 변경해보니 위와 같은 결과가 나왔습니다. 1로 초기화를 시켜줄 목적으로 사용했는데 왜 1로 초기화되지 않고 16843009라는 값이 나오게 되었을까요?

 

memset 잘못 사용할 경우

memset() 함수의 두번째 인자 값 value은 정수 형태로 함수에 넘겨주지만 실질적으로 memset 함수 안에서 이 value값을 unsigned char로 바꿔서 메모리 블록을 다루게 되어 이상한 값이 출력된것인데 int형은 4bytes이고 unsigned char은 1bytes이므로 int형 상수 1은 위의 그림과 같이 8bits 단위로 1로 초기화됩니다. 그러므로 배열 내 모든 값들이 16843009로 초기화된 것입니다. 따라서 memset() 함수를 초기화를 목적으로 사용할 때는 반드시 0 혹은 NULL 값만 사용하도록 합시다.

댓글

Designed by JB FACTORY