if I had a function receiving variable length argument
void print_arg_addr (int n, ...)
I can use these three macro to parse the argument
va_start(ap,v)
va_arg(ap,t)
va_end(ap)
In my understanding,
va_start lets ap point to second parameter,
va_arg move ap to next parameter,
va_end lets ap point to NULL.
so I use the snippet below to check my understanding, but it turns out that ap does not change, I expect ap will increment by 4 each time.
void print_arg_addr (int n, ...)
{
int i;
int val;
va_list vl;
va_start(vl,n);
for (i=0;i<n;i++)
{
val=va_arg(vl,int);
printf ("ap:%p , %d\n",vl,val);
}
va_end(vl);
printf ("ap:%p \n",vl);
}
int main()
{
print_arg_addr(5,1,2,3,4,5);
}
output:
ap:0x7ffc62fb9890 , 1
ap:0x7ffc62fb9890 , 2
ap:0x7ffc62fb9890 , 3
ap:0x7ffc62fb9890 , 4
ap:0x7ffc62fb9890 , 5
ap:0x7ffc62fb9890
Thank you!