memset은 변수를 초기화시킬 때 많이 사용하는 C 표준 함수다. 우리가 흔히 알고 있기로는 변수를 어떤 값으로 초기화시킬 때 사용한다고 알고 있다.
함수 원형을 살펴보면,
void *memset(void *dest, int c, size_t count);
위와 같다. 반환하는 값은 전달인자 c로 변경된 *dest 다.
아래 코드를 살펴보자.
#include <stdio.h>
int main(void)
{
char array[10] = {1,2,3,4,5,6,7,8,9,0};
for(int i = 0; i < 10; i++) {
printf("%d ", array[i]);
}
memset(array, 0, 10);
for(int i = 0; i < 10; i++) {
printf("%d ", array[i]);
}
}
첫번째 for문에서는 1, 2, 3, 4, 5, 6, 7, 8, 9, 0을 출력할 것이다. 두 번째 for문에서는? memset함수를 이용해 array을 0으로 초기화시켰기 때문에 0을 10번 출력할 것이다.
여기 까지는 예상 했던 결과다. 그럼 0이 아닌 1이나 2로도 초기화가 가능할까? "char형이라면 가능하다" 더 정확하게 말하면 "1byte짜리 자료형을 초기화시키는 것"이라면 가능하다. 이게 무슨 말이냐면.
memset 함수는 *dest가 가리키는 곳의 값을 c의 값으로 count만큼 초기화시키는데 이때 1 byte씩 초기화를 시킨다.
아래 코드를 보자.
#include <stdio.h>
int main(void)
{
int a = 10;
printf("%d\n", a);
memset(&a, 1, sizeof(int));
printf("%d\n", a);
}
첫번쨰 printf문에서 10을 출력할 것이다. memset으로 a를 1로 초기화시켜주고 난 다음 a를 출력해 보면?
우리가 예상한 결과는 1이 나와야 한다. 하지만 실제 출력결과 16843009이라는 값이 나올 것이다. 어? 왜지?
앞에서 말한 이유때문이다. memset은 *dest가 가리키는 곳의 값을 c로 초기화시키는데 1byte씩 끊어서 초기화 시키기 떄문이다.
변수 a는 integer형으로 4byte 자료형이다. 이 4byte 자료형을 1byte씩 나눠서 모두 1로 초기화시키기 때문에 16843009라는 값이 나온다. 계산기를 통해 확인해 보면
1byte씩 1로 초기화된 걸 확인할 수 있다. 이렇게 초기화된 값을 integer형으로 표현해서 16843009라는 값이 나온 것이다. memset을 사용할 때 주의해야 한다.
- 끝 -
'Programming language > C' 카테고리의 다른 글
[C]trunc, truncf, truncl 함수, 소수점 이하 자리 버림 함수 (0) | 2023.03.01 |
---|---|
[C] C언어 #연산자, ##연산자, c ## macro, 토큰 붙여넣기 연산자 (0) | 2023.02.27 |
[C] C언어, double to ascii, serial 통신에서 데이터 변환 (0) | 2022.12.30 |
[C] C 에서 typeof, typeof 란? C언어 typeof (0) | 2022.11.23 |
[C] float to ascii(실수형을 아스키 코드로) (1) | 2022.09.21 |