다음과 같은 배열을 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으로 초기화할 때만 사용하도록 하자.
'Develop(개발) > C\C++' 카테고리의 다른 글
C++로 만든 UP DOWN GAME (0) | 2021.01.28 |
---|---|
C++ string 클래스 정리 (0) | 2020.11.26 |