728x90
반응형

memset Function

메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수.
memory + setting 메모리를 (특정 값으로) 세팅한다.

Function Prototype
void* memset(void* ptr, int value, size_t num)

arg 1: void* ptr
세팅하고자 하는 메모리의 시작 주소
즉, 그 주소를 가리키고 있는 포인터가 위치하는 자리

arg 2: int value
메모리에 세팅하고자 하는 값을 넣으면 됨
int 타입으로 받지만 내부에서는 unsigned char로 변환되어서 저장
즉 'a' 이런 것을 넣어도 무방하다는 뜻

arg3 3: size_t num
길이를 뜻함. 이 길이는 바이트 단위로서 메모리의 크기 한조각 단위의 길이를 말함
보통 sizeof 형태로 작성하면 됨

Return 값은 성공 시 첫번째 인자로 들어간 ptr을 반환하고
실패시 NULL을 반환함.

Header file은 memory.h 또는 string.h 둘 중 하나 사용

 

#include <stdio.h>
#include <string.h>
#include <memory.h>

void printAll(int* pArr, int len)
{
	for (int i = 0; i < len; ++i)
	{
		printf("%d ", *(pArr + i));
	}

	printf("\n\n");
}

int main(void)
{
	/* Change to string array */
	char arr[] = "Hello World";
	memset(arr, 'c', sizeof(char) * 5);
	printf(arr);	// ccccc World

	puts("");


	/* Initialize array */

	// Use iteration 'for'
	int arr1[20];
	for (int i = 0; i < 20; ++i)
	{
		arr1[i] = 0;
	}

	printf("for  : ");
	printAll(arr1, 20);
	//for  : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
	
	puts("");

	// Use function 'memset'
	int arr2[20];
	memset(arr2, 0, sizeof(int) * 20);

	printf("memset : ");
	printAll(arr2, 20);
	//memset : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

	// Precaution //

	int arr3[5];
	
	// Initialize non zero value
	memset(arr3, 1, sizeof(arr3));

	for (int i = 0; i < 5; ++i)
	{
		printf("%d", *(arr + i));	// 9999999999
	}

	/*
	* '0'이 아닌 int 타입의 숫자를 넣게 되면 예상할 수 없는 값으로 세팅됨
	* 그 이유는 memset 함수는 1바이트 단위로 값을 초기화하기 때문
	* 1 byte 단위로 1을 만들었기 때문에 4byte로 표현된 int 숫자 1은 제대로 된 숫자로 표현 불가
	* 
	* 결론적으로,
	* 0이 아닌 그리고 char 타입이 아닌 값을 넣어서 세팅하려 할 때는
	* 우리가 원하는 값으로 세팅할 수 없음
	* 
	* 즉, 0과 char 타입만 사용할 수 있음
	* 그렇기 때문에 memset 함수는 보통 문자열(char 배열)에서 값을 변경하거나,
	* 숫자 배열을 0으로 세팅할 때 사용함
	*/


	return 0;
}
728x90
반응형

'Language > C & C++' 카테고리의 다른 글

Function pointer  (0) 2022.11.19
Visual Studio Short-cut  (0) 2022.11.18
[C, Python]Compare Score  (0) 2022.10.26
[TIP] strlen - remove newline  (0) 2022.10.26
[TIP] DO NOT USE fflush function  (0) 2022.10.25

+ Recent posts