오늘 알아볼 내용은 memset 함수다.
memset?
메모리(Memory)를 설정(Settting) 하는 함수다. memset함수를 사용하기 위해서는 string.h 파일이나 memory.h 파일이 include 되어 있어야 한다. 일반적으로 string.h파일을 include 한다. 아래 코드를 보자.
#include <stdio.h>
#include <string.h>
int main(void)
{
int a = 10;
printf("%d\n", a);
memset(&a, 0, (sizeof a));
printf("%d\n", a);
}
int형 변수 a가 10으로 초기화되어있고, printf를 통해 a를 출력한다. 결과는 10이 나올 것이다. 바로 아래 코드를 보면 memset이 나온다. msdn에 검색해보면 아래와 같이 나온다.
memset과 wmemset이 보인다. wmemset? 이건 우선 뒤로하고 memset먼저 살펴보자.
첫 번째 매개변수로 void *dest가 보인다. 포인터다. 어떤 주소를 전달하면 memset함수 안에서 해당 주소에 접근해 수정할 수 있다는 의미다.
두 번째 매개변수로 int형 변수 c가 보인다. *dest가 가리키는 주소를 초기화시킬 값을 넣어줘야 한다.
세 번째 매개변수는 size_t형 변수 count가 보인다. *dest가 가리키는 주소의 시작위치 부터 초기화 시킬 메모리의 크기(길이)를 넣어줘야 한다.
memset 함수 아래 printf문의 출력 값은 0이 된다.
memset으로 구조체 초기화
memset으로 구조체 변수도 초기화시킬 수 있다. 아래 코드로 설명하겠다.
struct People {
char name[20];
int age;
float height;
float weight;
};
int main(void)
{
struct People p = {"cong Park blog", 22, 183.8, 77.8};
printf("%s\n", p.name);
printf("%d\n", p.age);
printf("%.2f\n", p.height);
printf("%.2f\n", p.weight);
memset(&p.name, (int)'-', sizeof(char) * 4);
printf("%s\n", p.name);
printf("%d\n", p.age);
printf("%.2f\n", p.height);
printf("%.2f\n", p.weight);
}
사람의 정보를 표현하는 People 구조체를 만들고 People형 변수 p를 만들고 초기화시켰다. 여기서 주목할 점은 char name[20] 변수다.
memset 이전의 printf 4개의 출력을 확인해보면 아래와 같을 것이다.
cong Park blog
22
183.80
77.80
당연한 결과다. 그럼 memset 이후의 printf를 확인해보자.
---- Park blog
22
183.80
77.80
p.name 변수의 출력 중 맨 앞 4자리가 변경된 걸 확인할 수 있다. memset에 p.name의 주소 값을 전달했고(배열이기 때문에 별도의 인덱스를 지정하지 않으면 가장 첫 번째 인덱스의 주소 값을 전달) 초기화 값으로 '-'을 전달하고, count에 4byte를 전달했다. 결과는 맨 앞 'cong'만 '----'으로 초기화됐다. 그럼 &p.name를 다음과 같이 변경해보자.
memset(&p.name[5], (int)'-', sizeof(char) * 4);
변경하려는 주소를 변경했다. 출력 결과는? 아래와 같다.
cong ---- blog
정리하면,
변경하고자 하는 메모리 영역의 시작 위치부터 지정한 길이만큼 원하는 값으로 변경할 수 있다.
- 끝 -
'Programming language > C' 카테고리의 다른 글
[C] 포인터, C 포인터, C Pointer, 포인터 활용하기 - 1 (0) | 2022.09.03 |
---|---|
[C] sscanf, C언어 sscanf, sscanf 함수, sscanf 사용법 (0) | 2022.08.31 |
[C] memcpy, C언어 memcpy, memcpy 함수 (0) | 2022.08.31 |
assert, static_assert (0) | 2021.05.26 |
gcc __attribute__((used)), ((aligned(x))), ((packed)), ((weak)) (0) | 2021.05.26 |