[C] memset 사용법, memset 을 이용한 변수 초기화

728x90
반응형

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을 사용할 때 주의해야 한다. 

 

 

- 끝 -

 

 

728x90
반응형