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.
Nivethi said:
1 decade ago
How the ans comes?
Udaya said:
1 decade ago
First function calls the zeroth argument and first integer 12 is called.
Revathi said:
1 decade ago
I didn't understand.
Bablu said:
1 decade ago
I too didn't understand.
Sujatha said:
1 decade ago
In first function it call the string so apple is printed.
In second function it calls the 2nd argument i.e., 12.
In second function it calls the 2nd argument i.e., 12.
Karan said:
1 decade ago
First it will start to print from the char* type arguments from the first function list.
Then at second function it will go for the 2nd argument because first argument already taken in first function.
(If the third function would be like str = va_arg(ptr, char *); then it will print 'cat' because its third).
Then at second function it will go for the 2nd argument because first argument already taken in first function.
(If the third function would be like str = va_arg(ptr, char *); then it will print 'cat' because its third).
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.
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.
Savithri said:
1 decade ago
Can any one explain it properly?
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.
Post your comments here:
Quick links
Quantitative Aptitude
Verbal (English)
Reasoning
Programming
Interview
Placement Papers