c c99 c89 variadic-functions

¿Es seguro volver va_list en C?



c99 c89 (4)

Sin embargo, pasar un puntero a otra función es bastante diferente de devolver ese puntero. Muchas / la mayoría de las implementaciones almacenan los argumentos de variables reales en un marco de pila que se destruye cuando se devuelve la función vararg. (es decir, devolver una va_list o un puntero a uno, te dejará con punteros a las variables locales que se han destruido). - nos

Bueno, en mi caso, regresaría va_list de vuelta, pero gracias por avisarme - Hayri Uğur Koltuk

Si pasa un puntero a una va_list a la función MyFunc(va_list *args) , no necesita pasar la lista de argumentos modificados (por va_arg(*args, type) ), ya que MyFunc modifica la lista original.

Me gustaría escribir una función que tenga el tipo de retorno de va_list.

ejemplo: va_list MyFunc(va_list args);

¿Es esto seguro y portátil?


Lo que diga el estándar de idioma, es poco probable que esto funcione en la práctica. Es probable que una va_list sea ​​un puntero a un registro de llamada colocado en la pila por una persona que llama en beneficio de la persona que llama. Una vez que la persona que llama regresa, esa memoria en la pila es un juego justo para reutilizarlo.

Es probable que la devolución del tipo va_list no copie realmente el contenido de la lista a la persona que llama. Aunque esa sería una implementación válida de C, si la norma así lo exige, sería un defecto en la especificación.


Si bien definitivamente puede return ese valor, no estoy seguro de si el valor de retorno se puede usar de una manera útil.

Como el manejo de va_list s requiere un tratamiento especial ( va_end() requerido después de va_start() y va_copy() ), y las va_start/copy y va_end pueden contener { } para forzar este emparejamiento, no puede llamar a una sin la otra .


va_list podría (pero no se garantiza que sea) un tipo de matriz, por lo que no puede pasarlo o devolverlo por valor. El código que parece como si lo hiciera, podría estar simplemente pasando / devolviendo un puntero al primer elemento, por lo que puede usar el parámetro en el destinatario, pero podría estar actuando sobre el original.

Formalmente, probablemente pueda decir que va_list es un tipo de entidad, no un tipo de valor. Se copia con va_copy , no con asignación o mediante parámetros de función / retorno.