전공 수업을 공부하던 중 안교수님이 따로 가르쳐두신 memset() 함수에 대해 정리해보고자 한다!
메모리를 초기화 해줄 수 있는 memset() 함수
1. C언어, C++에서의 memset 함수
memset 함수는 메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수 이다.
그냥 직관적으로
"memory + setting 메모리를 (특정 값으로) 세팅한다." 이렇게 생각하면 편할 것 같다.
함수 원형
void* memset(void* ptr, int value, size_t num);
첫번째 인자 void* ptr은 세팅하고자 하는 메모리의 시작 주소
즉, 그 주소를 가리키고 있는 포인터가 위치하는 자리이다.
두번째 인자 value는 메모리에 세팅하고자 하는 값이다.
int 타입으로 받지만 내부에서는 unsigned char 로 변환되어서 저장된다.
즉 'a' 이런것을 넣어도 무방하다는 뜻임!
세번째 인자 size_t num은 길이를 뜻한다.
이 길이는 바이트 단위로써 메모리의 크기 한조각 단위의 길이를 말한다.
보통 "길이 * sizeof(데이터타입)" 의 형태로 작성하면 된다.
반환값은 성공하면 첫번째 인자로 들어간 pt(포인터)를 반환하고, 실패한다면 NULL을 반환한다.
ex)
char arr[] = "blockdmask";
memset(arr, 'c', 5 * sizeof(char));
print(arr);
이런식으로
첫번째 인자에는 변경하고자 하는 목적지의 첫번째 주소(포인터)를 넣고,
두번째 인자에는 변경하고자 하는 값 'c'를 넣어준다.
그리고 마지막 인자에는 변경하고자 하는 길이 5를 넣고 char 배열이 들어왔으므로 char 타입의 바이트 크기를 계산해서 곱해주면 끝!
2. C언어, C++ memset 함수 예제
예제1) 문자 배열 변경
1
2
3
4
5
6
7
8
9
10
11
12
|
#include<string.h> // #include<memory.h> 도 괜찮습니다.
#include<stdio.h>
int main(void)
{
char arr1[] = "blockdmask blog";
memset(arr1, 'c', 5 * sizeof(char));
printf(arr1);
return 0;
}
|
cs |
배열 "blockdmask blog"에서 앞자리 5자리가 'c' 값으로 초기화 된 것을 볼 수 있다.
예제2) 배열 초기화 for문과 memset
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include<memory.h> //#include<string.h>
#include<stdio.h>
void printAll(int* pArr, int len)
{
for (int i = 0; i < len; ++i)
{
printf("%d ", *(pArr + i));
}
printf("\n\n");
}
int main(void)
{
// 배열 초기화 for 문 이용
int arr1[20];
for (int i = 0; i < 20; ++i)
{
arr1[i] = 0;
}
printf("for : ");
printAll(arr1, 20);
// 배열 초기화 memset 함수이용
int arr2[20];
memset(arr2, 0, 20 * sizeof(int));
printf("memset : ");
printAll(arr2, 20);
return 0;
}
|
cs |
이렇게 배열을 0으로 초기화를 해야할때 for 반복문을 이용하기도 하는데!!
이렇게 memset 함수를 이용해서 초기화 할 수 도 있다!
예제3) 주의 사항
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include<memory.h>
#include<string.h> // 둘다 포함해도 노상관
#include<stdio.h>
int main(void)
{
int arr[5];
// 0 이 아닌 다른 값으로 세팅
memset(arr, 1, sizeof(arr));
for (int i = 0; i < 5; ++i)
{
printf("%d ", *(arr + i));
}
return 0;
}
|
cs |
결과에서 보셨듯이 0이 아닌 int 타입의 숫자를 넣게되면 예상할 수 없는 값으로 세팅 된다.
그 이유는 memset 함수는 1 바이트 단위로 값을 초기화 하기 때문이다.
1바이트 단위로 1를 만들었기 때문에 4바이트로 표현된 int 숫자 1은 제대로된 숫자로 표현될 수 없다.
0은 4바이트든 1바이트든 0 이기 때문에 동일한 결과값을 기대할 수 있던 것!
결론적으로
0 이아닌 그리고 char 타입이 아닌 값을 넣어서 세팅 하려고 할때는 우리가 원하는 값으로 세팅할수 없다.
0이랑 char 타입만 사용해야함.
그렇기 때문에 memset 함수는 보통 문자열(char 배열)에서 값을 변경하거나, 숫자배열을 0으로 세팅할때 사용한다.
'공부 STUDY > C | C++' 카테고리의 다른 글
[ C ] 겨울방학동안 C 포인터/ 구조체/ 동적메모리 개념 확실하게 익히기 | 자료구조 학습전 갖추어야할 베이스지식 (0) | 2023.01.28 |
---|---|
[C] fgetc() 함수의 반환값은 int (0) | 2022.12.03 |
[C] 동적 메모리 | malloc(), calloc(), realloc() 함수를 이용한 동적 메모리 할당 (1) | 2022.11.29 |
[C] 메모리 구조 | 스택, 힙, 데이터영역 | stack, Heap, Data (0) | 2022.11.29 |
[C언어] 헷갈리는 getchar() 함수 이해하기 (0) | 2022.11.24 |