본문 바로가기

알고리즘을 위한 간략 정리/입출력

[C++] memset 함수(메모리 초기화)

함수 이해

C언어와 C++에서 쓰이는 memset 함수는 

메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수 입니다.

 

주로 0으로 배열의 값들을 초기화할 때 자주 사용하는 함수입니다.

 

 

 

함수 원형

void* memset(void* ptr, int value, size_t num);

 

 

1. 반환값

: 정상적인 값이 들어온다면 첫 번째 인자로 들어온 ptr 포인터를 반환하지만,

실패한다면 NULL을 반환합니다.

 

 

2. 첫 번째 인자(void* ptr)

: 바꾸고자 하는 메모리의 시작 주소가 들어가는 자리입니다.

즉, 그 주소를 가리키고 있는 포인터가 위치하는 자리입니다.

 

흔히 사용하는 방법으로 배열을 초기화한다면 배열의 이름(배열의 시작 주소)이 들어갑니다.

Ex)

int Rank[500];
memset(Rank, ...);

 

 

3. 두 번째 인자(int value)

: 메모리에 세팅하고자 하는 값을 집어 넣으면 됩니다.

int 타입으로 인자를 받지만, 내부에서는 unsigned char로 변환되어서 저장됩니다.

 

 

여기서 주의할 점이 생깁니다.

unsigned char형은 1바이트 자료형이므로

 

byte형, int형, long형, float형의 1바이트를 초과하는 자료값이 들어올경우

값이 이상하게 초기화됩니다.

 

그러므로 value의 값으로는 0 혹은 char형만 쓰는 것이 좋습니다.

 

 

4. 세 번째 인자(size_t num)

: 길이를 뜻합니다.

이 길이는 바이트 단위로써 메모리의 크기 한 조각 단위의 길이를 말합니다.

 

사용할 때는 sizeof 함수를 사용해서 주로 넣어줍니다.

int Rank[500];
memset(Rank, 0, sizeof(Rank));

 

 

 

헤더 파일

memset 함수의 헤더파일은 string.h(C++의 경우 cstring도 가능)  혹은 memory.h를 사용해주면 됩니다.

위의 세 개의 헤더파일에 모두 정의되어 있기 때문입니다.

셋 중에 하나만 사용해주면 됩니다.

 

 

 

 

함수 예제

#include <iostream>
#include <cstring>
using namespace std;

int Example[10];

int main(void) {
    // 1. memset 사용 전
    for(int i = 0; i < 10; i++){
        Example[i] = 1;
    }

    for(int i = 0; i < 10; i++){
        cout<<Example[i]<<" ";
    }
    cout<<"\n";


    // 2. memset 사용 후
    memset(Example, 0, sizeof(Example));

    for(int i = 0; i < 10; i++){
        cout<<Example[i]<<" ";
    }
    cout<<"\n";
   
    return 0;
}

 

 

출력값

1 1 1 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0

 

이런 식으로 0으로 초기화할 때 주로 사용하는 memset 함수에 대해 알아봤습니다.

 

 

 

0이 아닌 다른 값으로 초기화할경우 char형만 가능하다는 사실을 꼭 기억해야겠습니다!