For more updates, check Programming Insights.
int fun2(int a, int b)
and we call the function
fun2(2,3,4)
we are sure to get the above error. So the question is how printf / scanf works with variable number of arguments? This is because C has a feature called ellipsis (…) by which you are able to pass variable number of arguments?
So the prototype of printf is
int printf(const char *str,...)
But the next question is how then can we access the arguments in the function. This can be done by the power of pointers. Let’s take a pointer which points to the last argument before …
and depending on the next arguments of what we expect, we increment the pointer and increment it accordingly
Below is a simple code which shows how this can be done
int print(const char *str,...)
/*str has the number of integers passed*/
{
int i;
int num_count=atoi(str);
int *num=(int *)&str;
for(i=1;i<=num_count;i++)
printf("%d ",*(num+i));}
int print_num(int num_count,...)
/*num_count contains the number of integers passed*/
{
int i;
int *num=&num_count;
for(i=1;i<=num_count;i++)
printf("%d ",*(num+i));
}
int main()
{
print_num(3,2,3,4);
print("3",2,3,4);
}
For more updates, check Programming Insights.
Filed under: C Tagged: | C, C Operator, printf(), Variable Arguments
[...] Variable Argument List Access Posted in C by John on March 7th, 2008 Here, I explained how we can utilize the operator ellipsis (…) to pass variable number of [...]
[...] Here, I explained how we can utilize the operator ellipsis (…) to pass variable number of arguments to a function. I have utilised there the concept of pointers to access the variable arguments. The standard C Library provides support to access these arguments. Use for this support All you need is to know the last argument before the ellipsis operator(At least one argument is must to use variable arguments), let’s call it larg [...]
That’s not a safe way to use the ellipsis operator, as it makes assumptions about padding and about the way arguments are passed that are not part of the C spec.
The correct way is to use the various methods exposed by stdarg, va_start, va_arg and va_end.