Develop(개발)/C\C++

[C/C++] memset() 함수의 사용법과 주의사항

seongmik 2023. 2. 5. 15:44
728x90
반응형

다음과 같은 배열을 0으로 초기화하는 상황을 생각해 보자.

int arr[100];

 

다음과 같이 for문을 사용해서 배열을 초기화하는 방법이 일반적이다.

for(int i=0;i<100;i++) {
	arr[i] = 0;
}

 

하지만 memset 함수를 이용하면 함수 호출 한 번으로 배열을 초기화할 수 있다.

memset함수는 정확히는 메모리 상의 일정 블록을 통채로 원하는 값으로 설정해 주는 함수이다.

 

memset은 <string.h> C 표준 헤더에 있는 함수이다.

#include <stirng.h>

void *memset(void *s, int c, size_t n);

memset 함수는 메모리상에서 포인터 s가 가리키는 위치부터 총 n bytes를 c로 채워준다.

memset은 포인터 s가 가리키는 주소를 가리키는 포인터를 반환한다.

 

여기서 memset 함수를 사용할 때 주의해야 할 점이 있는데 memset함수는 입력으로 주어진 포인터 s가 어떤 형인지 신경 쓰지 않는다는 점이다.

void* 형으로 입력을 받으므로 s는 어떤 자료형의 포인터든 받을 수 있지만, 메모리를 채울 때는 s의 자료형에 상관없이 1byte의 크기씩 c를 n개 채운다는 것이다.

 

다음과 같은 코드를 생각해 보자.

int arr[100];
memset(arr, 1, sizeof(int) * 100);

위 코드를 실행한 뒤에는 arr 배열이 1로 초기화되어있을까?

정답은 "그렇지 않다"이다.

int 자료형은 하나당 4 bytes의 메모리 공간을 차지한다.

하지만 memset 함수는 1byte 단위로 c를 집어넣기 때문실제로 메모리에는 다음과 같은 수로 가득 차게 된다.

00000001000000010000000100000001

4 bytes안에 1byte의 1이 4개 이어 붙어 있는 모양이다.

따라서 이를 int형은 16843009라는 수로 읽게 되는 것이다.

따라서 memset을 사용해서 메모리를 초기화할 때 포인터의 자료형이 1byte인 unsigned char가 아니라면 0으로 초기화할 때만 사용하도록 하자.

728x90
반응형

'Develop(개발) > C\C++' 카테고리의 다른 글

C++로 만든 UP DOWN GAME  (0) 2021.01.28
C++ string 클래스 정리  (0) 2020.11.26