본문 바로가기

42cursus

va_start(ap, v)에서 두번째 인자 부터 받아오게 되는 이유.

printf 라이브러리 함수 구현 프로젝트를 다시 시작 하려는데

너무 오랜만에 보니까 가변인자 쓰는 법도 까먹었다.

그러다 보니 다시금 궁금한 점이 생겼는데, 기록 해놓으려고 한다.

가령,

int 가변인자함수(int argc, ...)
{
va_list ap;
va_start(ap, argc);
int variable = va_arg(ap, int);
printf("%d\n", variable);
}

int main()
{
가변인자함수(4, 10, 20, 30, 40);
}

라는 코드가 있다면, 무엇이 출력 될까?
4가 아니라 10이 출력된다.
va_start로 가변인자포인터 ap를 초기화할때 어떤 식으로 받아 오느냐?

 

 

 


이렇게 받아온다.
v의 크기만큼 뒤로 간 주소부터 첫번째 가변 인자가 등장한다.

 

실제 코드도
#define va_start(ap, v) ( (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v))

이런 식으로 되어있다.

 

고정인수 v 자리에는 char형 포인터도 들어갈 수 있고, 기타 등등 다른 여러 자료형의 변수를 넣어도 된다.
어쨌든 va_start를 호출 하면 v의 크기 만큼 뒤로 이동한 주소에서 ap가 시작하게 되고, 우리는 차례대로 가변 인자를 받아올 수 있게 되는 것이다.
고로 가변파라미터를 사용 하려면 최소 하나의 고정인수가 필요하다.
그래야 주소를 얻어서 그 크기만큼 뒤로 간 다음 첫번째 가변인자의 올바른 시작 주소에 접근 할 수 있으니까.
v가 시작 주소이고 v, 가변인자들을 요소로 갖는 배열에 접근 하는 셈이다.

 

혹시 이 글을 보는 사람 중에
저거 틀렸는데? 하는 부분이 있다면
언제든지 댓글 달아 주시길 바란다.
저도 잘 모르는 학생이라 혹시 틀렸으면 바로 잡고 싶어요~!

 

이제 프엪 만들러 가야지~~

 

참고 : https://jhnyang.tistory.com/293

'42cursus' 카테고리의 다른 글

fdf 해야할것 4  (0) 2022.01.23
fdf 해야할것 3  (0) 2022.01.19
fdf 해야할것 2  (4) 2022.01.18
fdf 해야할 것 1  (0) 2022.01.17
Wireframe (Wire-frame model)이란?  (2) 2022.01.02