Search code examples
cvariadic-functions

Passing va_list to other functions


I have been trying to pass variable arguments to other function in C but it is producing inconsistent result in different runtime environment as well as in different runs in same environment:

int main() 
{ 
    int result = myprintf("Something \n %d", 9); 
    return result;
}

int myprintf(const char *format, ...){
    printf("Something \n %d", 9); 
    printf("\n");
    va_list args;        
    va_start(args, format);    
    int result = printf(format,args);
    printf("\n");
    va_end(args);
    return result;
} 

And the result produced is:

WWW.FIRMCODES.COM 
 9
WWW.FIRMCODES.COM 
 438656664

I could not find the reason for "438656664".


Solution

  • You cannot pass the variadic arguments to a variadic function. Instead, you must call a function that takes a va_list as argument. The standard library provides variants of printf and scanf that take a va_list; their names have the prefix v.

    Your example should look like:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdarg.h>
    
    int printfln(const char *format, ...)
    {
        int result;
        va_list args;
    
        va_start(args, format);
        result = vprintf(format, args);
        printf("\n");
        va_end(args);
    
        return result;
    }
    
    int main()
    {
        int result = printfln("Something \n %d", 9);
    
        printf("(%d)\n", result);
    
        return 0;
    }
    

    There are some gotchas, for example when you want to call two v... function for printing to the screen and a log file: The v... function may exhaust the va_list, so you must pass in a fresh one to each call if your code should be portable.