42Seoul/printf

가변 인자(va_start, va_arg, va_copy, va_end)

재윤 2023. 5. 20. 15:37
반응형

C언어에서 va_start, va_arg, va_copy, va_end을 사용하려면

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

void f(int n, ...)
{
	va_list v1;
	va_start(v1, n);

	int a;
	for (int i = 0; i < n; i++)
	{
		a = va_arg(v1, int);
		printf("%d", a);
	}
	
	va_end(v1);
}

int	main()
{
	f(5, 1, 2, 3, 4, 5);

}
  • int n == 몇 개 가변인자를 넘겨줄 것인가.
  • 매개변수들이 넘어올 때 int형 보다 작은 범위는 int로 double 보다 작은 범위는 double로 포인터는 void*로 넘어옴
    • float, char는 안 넘어감
  • va = variable argument
  • va_list 가변인자 리스트
    • va_list(v1) → 가변인자 리스트 이름을 v1. 가변인자들을 담을 거임.
  • va_start 가변인자을 사용하려면 초기화 해야하니 시작지점을 알려줌.
    • va_start(v1, n) → 가변인자 시작지점 n 변수 다음.
  • va_arg 가변인자들 type에 맞게 사용(타입을 지정해주는 것이 아니라 이 타입이라고 알려줘야함.)
    • va_arg(v1, int); → int형이라고 알려주는 것이며, 다음 매개 변수로 넘어감.
  • va_end 가변인자를 그만 사용한다는 말
    • 이거 없어도 작동하지만 다른 컴파일러에서는 이게 꼭 필요하기에 꼭 적어주자.

예제들을 통해서 뭐가 넘어가고 안 넘어가는지 보쟈

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

void f(int n, ...)
{
	va_list v1;
	va_start(v1, n);

	
	printf("%s", va_arg(v1, char *));
	printf("%c", *(va_arg(v1, char *)));
	printf("%f", va_arg(v1, double));
	printf("%d", va_arg(v1, int));
	va_end(v1);
}

int	main()
{
	//포인터
	char *p = "awd";
	
	//char 형(char로 뽑을 때)
	char aa = 'a';
	char *p1 = &aa;

	//char 형
	char ch = 'c';
	
	f(4, p, p1, 10.2, ch);

}
  1. 포인터형을 넘길 때
#include <stdio.h>
#include <stdarg.h>

void f(int n, ...)
{
	va_list v1;
	va_start(v1, n);

	
	printf("%s", va_arg(v1, char *));
	va_end(v1);
}

int	main()
{
	//포인터
	char *p = "awd";
	
	
	f(1, p);

}

 

 2. char형 하나만 할당해서 포인터 변수로 넘겨줄 때

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

void f(int n, ...)
{
	va_list v1;
	va_start(v1, n);

	
	printf("%c", *(va_arg(v1, char *)));

	va_end(v1);
}

int	main()
{

	//char 형(char로 뽑을 때)
	char aa = 'a';
	char *p1 = &aa;

	
	f(1, p1);

}

 3. 소수점

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

void f(int n, ...)
{
	va_list v1;
	va_start(v1, n);

	printf("%f", va_arg(v1, double));

	va_end(v1);
}

int	main()
{

	f(1, 10.2);

}

 4. char 형

→ char형은 넘기더라도 가변인자에서 int형으로 받음 

왜 그럴까?

-> 가변인자에서는 최소 바이트수가 4바이트이기 때문

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

void f(int n, ...)
{
	va_list v1;
	va_start(v1, n);

	printf("%d", va_arg(v1, int));
	va_end(v1);
}

int	main()
{
	//char 형
	char ch = 'c';
	
	f(1, ch);

}

반응형

'42Seoul > printf' 카테고리의 다른 글

printf implement  (0) 2023.05.20
printf 반환형(반환형이 왜 int일까?)  (0) 2023.05.20