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, 가변인자들을 요소로 갖는 배열에 접근 하는 셈이다.
혹시 이 글을 보는 사람 중에
저거 틀렸는데? 하는 부분이 있다면
언제든지 댓글 달아 주시길 바란다.
저도 잘 모르는 학생이라 혹시 틀렸으면 바로 잡고 싶어요~!
이제 프엪 만들러 가야지~~
'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 |