C Programming - Variable Number of Arguments - Discussion
Discussion Forum : Variable Number of Arguments - Find Output of Program (Q.No. 5)
5.
What will be the output of the program?
#include<stdio.h>
#include<stdarg.h>
void fun1(int num, ...);
void fun2(int num, ...);
int main()
{
fun1(1, "Apple", "Boys", "Cats", "Dogs");
fun2(2, 12, 13, 14);
return 0;
}
void fun1(int num, ...)
{
char *str;
va_list ptr;
va_start(ptr, num);
str = va_arg(ptr, char *);
printf("%s ", str);
}
void fun2(int num, ...)
{
va_list ptr;
va_start(ptr, num);
num = va_arg(ptr, int);
printf("%d", num);
}
Discussion:
16 comments Page 1 of 2.
Goroparthi said:
8 years ago
How the answer comes? Please explain.
Brandon said:
8 years ago
First arg array:
1, "Apple", "Boys", "Cats", "Dogs"
va _start( ptr , 1)
puts the start point at the first element (arg arrays start at 1, not 0), so the start point is the element "1"
va_arg (ptr,char*)
says, return the first element that is a char pointer, which is the second element "Apple*
Second arg array:
2, 12, 13, 14
va _start( ptr , 2)
means the starting point it the second element in the array, "12"
va_ arg(ptr,int)
Means return the first element that is type int from the starting point. Since the element the staring pointer is point to, it returns it which is "12"
The confusion comes from:
1) element 1 is the first element in the array, NOT the element at index 0.
2) the first element is used as both the starting element and counts as an element in the array, it is not "consumed".
3) va_ arg returns the first element which matches the given data type, from the starting point previously set by va_start.
1, "Apple", "Boys", "Cats", "Dogs"
va _start( ptr , 1)
puts the start point at the first element (arg arrays start at 1, not 0), so the start point is the element "1"
va_arg (ptr,char*)
says, return the first element that is a char pointer, which is the second element "Apple*
Second arg array:
2, 12, 13, 14
va _start( ptr , 2)
means the starting point it the second element in the array, "12"
va_ arg(ptr,int)
Means return the first element that is type int from the starting point. Since the element the staring pointer is point to, it returns it which is "12"
The confusion comes from:
1) element 1 is the first element in the array, NOT the element at index 0.
2) the first element is used as both the starting element and counts as an element in the array, it is not "consumed".
3) va_ arg returns the first element which matches the given data type, from the starting point previously set by va_start.
Saba said:
8 years ago
I didn't understand. Please explain.
Ajay said:
8 years ago
According to me,
fun1
num=1
ptr is a va_list variable.
ptr , 1
str copy Apple // ptr=1 so first string copy
Apple //print
fun2
num=2
ptr=2
num= (12+13)/2 // average of first two number
num =12
12 //print
The final answer is;
Apple12.
fun1
num=1
ptr is a va_list variable.
ptr , 1
str copy Apple // ptr=1 so first string copy
Apple //print
fun2
num=2
ptr=2
num= (12+13)/2 // average of first two number
num =12
12 //print
The final answer is;
Apple12.
Anonymous said:
8 years ago
Here, in void func 1,
va _start( ptr , num ) points to first argument in func 1 ie '1'
str=va_arg (ptr,char*) points to next argument in func 1 ie 'Apple' as there is no loops it directly prints Apple.
In void func2,
va_start( ptr,num) points to first argument in void func2 ie '2'
va_ arg(ptr,int) points to next argument in void func2 ie. '12' as there is no loops it directly prints '12' as output.
So our output is Apple 12.
va _start( ptr , num ) points to first argument in func 1 ie '1'
str=va_arg (ptr,char*) points to next argument in func 1 ie 'Apple' as there is no loops it directly prints Apple.
In void func2,
va_start( ptr,num) points to first argument in void func2 ie '2'
va_ arg(ptr,int) points to next argument in void func2 ie. '12' as there is no loops it directly prints '12' as output.
So our output is Apple 12.
Ram said:
1 decade ago
I didn't understand. Please correct explanation.
Ashwini Srivastava said:
1 decade ago
At 1st calling function called i.e. str = va_arg(ptr, char *);
It takes very 1st character pointer which starts after the num {void fun1(int num, ...);} and when the 2nd calling function called i.e. num = va_arg(ptr, int);
It takes the 1st argument of function after num {void fun2(int num, ...);}
Here va_start(ptr, num) change the location of calling function.
If you cannot call va_start function in definition fun1 then it show segmentation fault and if you cannot call in definition of fun2 then it take after 12 i.e 13.
So, you have to understand how va_start and va_arg function works.
It takes very 1st character pointer which starts after the num {void fun1(int num, ...);} and when the 2nd calling function called i.e. num = va_arg(ptr, int);
It takes the 1st argument of function after num {void fun2(int num, ...);}
Here va_start(ptr, num) change the location of calling function.
If you cannot call va_start function in definition fun1 then it show segmentation fault and if you cannot call in definition of fun2 then it take after 12 i.e 13.
So, you have to understand how va_start and va_arg function works.
Savithri said:
1 decade ago
Can any one explain it properly?
Pallavi said:
1 decade ago
In 1st function it calls %s. So it is string using va_list ptr, in 2nd function va_list ptr calls %d and at 2nd pointer of the 2nd function.
ChaZ said:
1 decade ago
As I couldn't find any precise explanations, so I decided to post one myself:
va_start() always points to the 1st parameter of the "Variable Argument List (...)". Hence, in both the cases we are getting the first parameter as the output, as va_arg() is retrieving the first argument.
Note: If va_arg() is called multiple times by any mechanism then it will simply advance the pointer in the Var. Arg. List. It even returns garbage if the list's bound is passed.
va_start() always points to the 1st parameter of the "Variable Argument List (...)". Hence, in both the cases we are getting the first parameter as the output, as va_arg() is retrieving the first argument.
Note: If va_arg() is called multiple times by any mechanism then it will simply advance the pointer in the Var. Arg. List. It even returns garbage if the list's bound is passed.
Post your comments here:
Quick links
Quantitative Aptitude
Verbal (English)
Reasoning
Programming
Interview
Placement Papers