Taene's
[C++] std::memset 본문
0. memset 정의
- memory+setting(메모리를 특정값으로 세팅해주는 함수)
1. memset 함수 원형
//함수 원형
void* memset(void* ptr, int value, size_t num);
- 첫번째 인자 void* ptr은 세팅하고자 하는 메모리의 시작 주소이다. 즉, 그 주소를 가리키고 있는 포인터가 위치하는 자리이다. 보통 배열의 이름을 넣는다.
- 두번째 인자 value는 메모리에 세팅하고자 하는 값을 집어 넣으면 된다. int 타입으로 받지만 내부에서는 unsigned char 로 변환되어서 저장된다. 즉, 'a'와 같은 char 형태로 넣어도 된다.
※ memset 함수는 1byte단위로 값을 초기화하기 때문에 4byte로 표현된 int 숫자 1은 제대로 된 숫자로 표현될 수 없다. 반면에 0은 4byte든 1byte든 0이기 때문에 동일한 결과값이 나온다.
결론적으로, 0 이아닌 그리고 char 타입이 아닌 값을 넣어서 세팅 하려고 할때는 우리가 원하는 값으로 세팅할 수 없으므로 가급적 숫자 0과 char 타입만 사용하자.
(memset 함수는 보통 문자열(char 배열)에서 값을 변경하거나, 숫자배열을 0으로 세팅할때 사용한다.)
- 세번째 인자 size_t num은 길이를 뜻한다. 이 길이는 바이트 단위로써 메모리의 크기 한조각 단위의 길이를 말한다. 이는 보통 '길이 * sizeof(데이터타입)' 의 형태로 작성한다.
2. 헤더파일
//둘 다 사용 가능
#include <memory.h>
#include <string.h>
3. 1차원 배열과 2차원 배열의 memset을 이용한 초기화 방법
#include <iostream>
#include <memory.h>
#include <string.h>
int main()
{
/* 1차원 배열 */
memset(arr, 0, sizeof(arr)); //memset(배열시작포인터(배열이름), 초기화할값, sizeof(배열이름)/초기화할 바이트크기);
/* 2차원 배열 */
for (int i = 0; i < 10; i++) //i는 행의 범위
{
memset(arr[i], 0, sizeof(int) * 10); //모든 값 0으로 초기화
//sizeof(int)*10에서 10은 열의 크기
}
}
4. 예제
char arr[] = "blockdmask";
memset(arr, 'c', 5 * sizeof(char));
print(arr);
//출력: "cccccdmask"
- 첫번째 인자에는 변경하고자 하는 목적지의 첫번째 주소(포인터)를 넣는다.
- 두번째 인자에는 변경하고자 하는 char 형태의 값 'c'를 넣는다.
- 마지막 인자에는 변경하고자 하는 길이 5를 넣고 char 배열이 들어왔으므로 char 타입의 바이트 크기를 계산해서 곱해서 바이트 길이를 넣는다.
'C++ 개념 공부 > STL' 카테고리의 다른 글
[C++] 동적 크기 배열 구현하기(dynamic_array) (0) | 2024.05.13 |
---|---|
[C++] 파일 입출력(fstream) (0) | 2024.04.02 |
[C++] std::map (0) | 2023.09.11 |
[C++] std::stack (0) | 2023.09.04 |
[C++] std::pair (1) | 2023.09.03 |