Taene's

[C++] std::memset 본문

C++ 개념 공부/STL

[C++] std::memset

taene_ 2024. 3. 15. 13:22

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