이 게시글은
https://blockdmask.tistory.com/441 을 원본으로 하여 주석을 달며 공부한 내용을 기록한 게시글임을 명시합니다.
백준 2447번 별찍기 10의 다른 사람 코드를 공부하다가 memset이란 함수가 나와서 이를 공부하게 되었습니다.
여기부터 게시글
오늘 C언어 C++의 메모리를 초기화 해줄 수 있는 memset 함수에 대해서 시작해보겠습니다.
C언어, C++에서의 memset 함수
memset 함수는 메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수 입니다.
함수이름이 정말 명확하죠? memory + setting 메모리를 (특정 값으로) 세팅한다.
기억하기 쉬울것 입니다. 그럼이제 함수를 하나하나 쪼개서 분해해 볼까요?
함수 원형
void memset(void ptr, int value, size_t num);
첫번째 인자 void* ptr은 세팅하고자 하는 메모리의 시작 주소.
즉, 그 주소를 가리키고 있는 포인터가 위치하는 자리 입니다.
두번째 인자 value는 메모리에 세팅하고자 하는 값을 집어 넣으면 됩니다.
int 타입으로 받지만 내부에서는 unsigned char 로 변환되어서 저장됩니다. 즉 'a' 이런것을 넣어도 무방하다는 뜻입니다.
//unsigned char는 보통 한국어,중국어,일본어 등을 표현하기 위해 사용하는데 여기서 왜 unsigned char로 변환되어 저장하는걸까?
세번째 인자 size_t num은 길이를 뜻합니다. 이 길이는 바이트 단위로써 메모리의 크기 한조각 단위의 길이를 말합니다. 이는 보통 "길이 * sizeof(데이터타입)" 의 형태로 작성하면 됩니다.
//size_t가 뭔가 하고 찾아봤더니 어떤 객체나 값이 포함할 수 있는 최대 크기의 데이터를 표현하는 타입이라고 한다.
일단 어떤 함수인지 보고 이를 다시 봐야겠다.
반환값은 성공하면 첫번째 인자로 들어간 ptr을 반환하고, 실패한다면 NULL을 반환합니다.
아 그리고, 헤더파일은 memory.h 혹은 string.h 둘중 하나를 사용해도 무방합니다. 두개다 memset 함수가 정의되어있기 때문입니다. (둘다 써도 괜찮아요)
아래 예제로 들어가기 전에 간단하게 예제를 한번 작성해보겠습니다.
char arr[] = "blockdmask";
memset(arr, 'c', 5 * sizeof(char));
print(arr);
//아 방금 size를 준게 arr에서 시작해서 5칸동안을 모두 c로 채우기 위해서구나.
이런식으로
첫번째 인자에는 변경하고자 하는 목적지의 첫번째 주소(포인터)를 넣고,
두번째 인자에는 변경하고자 하는 값 'c'를 넣었습니다.
그리고 마지막 인자에는 변경하고자 하는 길이 5를 넣고 char 배열이 들어왔으므로 char 타입의 바이트 크기를 계산해서 곱해주었습니다. 그렇게 해서 바이트 길이를 넣어준 것 입니다.