본문 바로가기
Language/C언어

C043_가변인자 사용하기

by OdOp 관리자 2023. 12. 30.
SMALL

시작하기에 앞서서 가변인자에 대해 알아야 합니다. 

가변인자란?

인수의 개수와 타입이 미리 정해져 있지 않다는 뜻입니다. 

 

그렇다면 시작과 끝에 대한 정보가 필요할 것입니다. 이 정보를 고정 인수를 통하여 알아낼 수 있어야 합니다. 

 

 

따라서 반드시 하나 이상의 고정 인수를 가져야 합니다. 

지금부터 고정 인수의 역할에 대해 알아보도록 하겠습니다. 

고정 인수의 역할

  • 고정 인수 다음부터 가변 인수가 시작이 되기 때문에 가변 인수의 시작점을 알아차리게 해 줍니다. 
  • 가변 인수들이 어떤 자료형으로 들어와 있는지도 알아내야 합니다. 
  • 가변 인수의 개수를 알아낼 수 있는 정보가 있어야 합니다. 

 

지금까지 배운 내용을 통하여 예시를 들어보도록 하겠습니다. 

 

#include <stdio.h>
#include <stdarg.h>

void    test(int count, ...)
{
    int i;
    int n;
    va_list ap;

    if (count <= 0)
        return ;
    printf("%d개의 수를 출력합니다. \n", count);
    i = 0;
    va_start(ap, count);
    while (++i <= count)
    {
        n = va_arg(ap, int);
        printf("%d번째 수 : %d\n", i, n);
    }
    va_end(ap);
}

int main(void)
{
    test(3, 1, 2, 3);
    return (0);
}

 

오!! 위에서 다루지 않은 내용이 많이 포함이 되어 있는 것 같습니다. 

 

우선 위에서 배운 내용부터 차근차근 정리해 보면서 해보도록 하겠습니다. 

void    test(int count, ...)

 

제가 고정 인수는 무조건 하나 이상 있어야 한다고 설명을 드렸습니다. 

고정 인수에 꼭 필요한 정보에 대해서도 말씀을 드렸죠.

위에 있는 고정 인수의 역할에 하나하나 매칭해 보면서 살펴보도록 하겠습니다. 

  • 가변 인수의 시작점은 count뒤에서부터 시작이 되게 됩니다.
  • 가변 인수의 자료형(type)은 고정 인수인 count와 같은 자료형을 사용합니다. 
  • 가변 인수의 개수는 count의 수입니다. 

 

가변 인수의 위치를 담을 메모리 주소가 필요합니다.

va_list ap;

 

가변 인수의 위치를 나타나게 될 포인터 주소입니다.

현재는 아직 쓰레기 위치에 있습니다. 이를 저희가 원하는 위치로 바꾸어 주어야 합니다. 

 

 

가변 인수의 시작점은 count뒤에서부터 시작되게 됩니다. 

va_start(ap, count);

 

이제 ap의 시작점을 count뒤로 초기화를 해주는 부분입니다. 

 

 

가변 인수의 자료형(type)은 고정 인수인 count와 같은 자료형을 사용합니다. 

n = va_arg(ap, int);

 

va_arg(ap, int)는 ap의 위치를 int자료형 만큼 넘겨준다는 뜻입니다. 

위의 예에서는 가변 인수 모두 int자료형만을 사용하기 때문에 가변 인수 하나를 읽을 때마다 int자료형 만큼을 넘기게 됩니다. 

 

 

끝까지 다 읽었을 경우에 ap를 초기화시켜 주어야 합니다. 

ap에는 저희가 읽었던 값들이 써져 있습니다. 이를 NULL로 바꾸어 주는 부분입니다. 

va_end(ap);

 

사실 위의 명령어는 넣어주어도 그만 넣어주지 않더라도 코드에는 큰 문제가 발생하지 않습니다. 

그럼에도 위의 명령어를 사용하는 이유는 플랫폼에 따라서는 가변 인수를 읽은 후에 뒤처리를 해야 하는 경오도 있기 때문입니다. (즉, '호환성 때문에 관례적으로 넣어 주는 것이 좋다.'라고 이해하셔도 좋을 것 같습니다. )

 

 

 

이렇게 오늘은 가변 인자를 사용하는 방법에 대해 간략하게 알아보았습니다. 하시는 프로젝트 혹은 과제에 많은 도움이 되셨으면 좋겠습니다. 

LIST

'Language > C언어' 카테고리의 다른 글

C045_perror함수 사용하기  (0) 2024.01.03
C044_malloc 사용하기  (0) 2024.01.02
C042_Makefile 만들기  (2) 2023.12.29
C041_read함수 사용하기  (0) 2023.12.28
C040_strlen 함수 구현해서 사용하기  (0) 2023.12.08