- C Library - Home
- C Library - <assert.h>
- C Library - <complex.h>
- C Library - <ctype.h>
- C Library - <errno.h>
- C Library - <fenv.h>
- C Library - <float.h>
- C Library - <inttypes.h>
- C Library - <iso646.h>
- C Library - <limits.h>
- C Library - <locale.h>
- C Library - <math.h>
- C Library - <setjmp.h>
- C Library - <signal.h>
- C Library - <stdalign.h>
- C Library - <stdarg.h>
- C Library - <stdbool.h>
- C Library - <stddef.h>
- C Library - <stdio.h>
- C Library - <stdlib.h>
- C Library - <string.h>
- C Library - <tgmath.h>
- C Library - <time.h>
- C Library - <wctype.h>
- C Programming Resources
- C Programming - Tutorial
- C - Useful Resources
C library - va_start() macro
The C stdarg library va_start() macro enables access to the variable arguments following the named argument parmN. It is used to initialize a 'va_list' variable, which is then used to retrieve the additional arguments passed to the function.
The va_start should be called with an instance to a valid va_list (variable list) object ap before any calls to va_arg (variable argument).
This macro is useful for creating a variadic function, allowing us to create a function that can take variable number of arguments. It contains at least one fixed argument followed by an ellipsis (...).
Syntax
Following is the C library syntax of the va_start() macro −
void va_start(va_list ap, parmN)
Parameters
This macro accepts a following parameters −
-
ap − It is a va_list type variable that will be initialize by 'va_start'. This variable is used to traverse the list of arguments.
parmN − It is name of the last named parameter in the function definition.
Return Value
This macro does not returns any value.
Example 1
The following is the basic c example that demonstrate the use of va_start().
#include <stdio.h>
#include <stdarg.h>
int sum(int count, ...) {
va_list args;
int tot = 0;
// Set the va_list variable with the last fixed argument
va_start(args, count);
// Retrieve the arguments and calculate the sum
for (int i = 0; i < count; i++) {
tot = tot + va_arg(args, int);
}
// use the va_end to clean va_list variable
va_end(args);
return tot;
}
int main() {
// Call the sum, with number of arguments
printf("Sum of 3, 5, 7, 9: %d\n", sum(4, 3, 5, 7, 9));
printf("Sum of 1, 2, 3, 4, 5: %d\n", sum(5, 1, 2, 3, 4, 5));
return 0;
}
Output
Following is the output −
Sum of 3, 5, 7, 9: 24 Sum of 1, 2, 3, 4, 5: 15
Example 2
In this example, we use the va_start() to count the number of passed argument in the user-defined function.
#include <stdio.h>
#include <stdarg.h>
int cnt(int count, ...) {
va_list args;
int num_of_arg = 0;
// Set the va_list variable with the last fixed argument
va_start(args, count);
// Retrieve the arguments and count the arguments
for (int i = 0; i < count; i++) {
num_of_arg= num_of_arg + 1;
}
// use the va_end to clean va_list variable
va_end(args);
return num_of_arg;
}
int main() {
// Call the sum, with number of arguments
printf("Number of arguments: %d\n", cnt(4, 3, 5, 7, 9));
printf("Number of arguments: %d\n", cnt(5, 1, 2, 3, 4, 5));
return 0;
}
Output
Following is the output −
Number of arguments: 4 Number of arguments: 5
Example 3
Let's see the another example, here we create a function that concatenates a variable number of strings into a single result string.
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
char* concatenate(int count, ...) {
va_list args;
int length = 0;
// calculate length
va_start(args, count);
for (int i = 0; i < count; i++) {
length = length + strlen(va_arg(args, char*));
}
va_end(args);
// Allocate memory for the result string
char *res = (char*)malloc(length + 1);
if (!res) {
return NULL;
}
// Concatenate the strings
// Initialize result as an empty string
res[0] = '\0';
va_start(args, count);
for (int i = 0; i < count; i++) {
strcat(res, va_arg(args, char*));
}
va_end(args);
return res;
}
int main() {
char *res = concatenate(3, "Hello, ", "tutorialspoint", "India");
if (res) {
printf("%s\n", res);
//free the alocated memory
free(res);
}
return 0;
}
Output
Following is the output −
Hello, tutorialspointIndia