stdarg.h y char paraments

Aquí está mi código:

void a_simple_func_with_variable_argument(int, ...); void a_simple_func_with_variable_argument(int start, ...) { va_list pa; char ch; va_start(pa, start); while(ch = va_arg(pa, char)) { printf("%c, ", ch); } printf("End\n"); va_end(pa); } ... //call the func above in somewhere a_simple_func_with_variable_argument(1, 'a', 'b', 'c', '\0'); 

Falló después de ser comstackdo por gcc, ¿qué me falta?

Necesitas tener cuidado con el char ; Se promueve automáticamente a int en una función variable. Deberá pasar int como segundo va_arg a va_arg .

Cuando compilo su ejemplo (después de arreglar va_arg (pa, char)), el comstackdor (gcc 4.6) me dice

ac: En la función ‘a_simple_func_with_variable_argument’:
ac: 8: 14: advertencia: ‘char’ se promueve a ‘int’ cuando se pasa por ‘…’ [habilitado de forma predeterminada]
ac: 8: 14: nota: (por lo que debe pasar ‘int’ no ‘char’ a ‘va_arg’)
ac: 8: 14: nota: si se alcanza este código, el progtwig abortará

Así que no hay sorpresa aquí.

 int func(char a, char b, char c) /* DEMONSTRATION that char on stack is promoted to int !!! note: this promotion is NOT integer promotion of literals, but promotion during handling of the stack. don't confuse the two */ { const char *p = &a; printf("a=%d\n" "b=%d\n" "c=%d\n", *p, p[-(int)sizeof(int)], p[-(int)sizeof(int) * 2]); // don't do this. might probably work on x86 with gcc (but again: don't do this) } 

El mensaje es va_arg(ap, char) y va_arg(ap, short) es incorrecto. Use va_arg(ap, int) lugar: manejará los argumentos de tipo int y el tipo “más pequeño” (short, char).

Consulte también http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html Cita: “Tenga cuidado aquí para evitar problemas que podrían ser causados ​​por conversiones aritméticas. El uso de char o short como el segundo argumento para va_arg es invariablemente un error: estos tipos siempre promueven hasta uno de int firmado o unsigned int, y los flotantes se convierten al doble “.