va_arg (, double) retourne chaque fois une valeur invalide

Lorsque j’exécute cet exemple de programme en utilisant va_arg (ap, double), j’ai trouvé que va_arg renvoyait des données non valides, telles que 0 au lieu de 3 ou 1,2 au lieu de 1, de telle sorte que si je transmets une valeur entière sans .00 au lieu du double format, cela crée une erreur données (soit 3 au lieu de 3,00) !!!

#include  #include  void func(int s){ printf("%s: %d\n",__func__,s); } void var(int count,...){ va_list ap; va_start(ap,count); double a = va_arg(ap,double); printf("%f\n",a); va_end(ap); } void main(void ) { printf("%s,%d,%s\n",__FILE__,__LINE__,__DATE__); func(__LINE__); var(1,3); var(1,1.2); var(1,1); } 

La sortie est:

 try.c,24,Sep 25 2012 func: 25 0.000000 1.200000 1.200000 

Les fonctions variadiques (c’est-à-dire celles qui prennent un nombre variable d’arguments indiqué par le paramètre points de suspension ( ... )) ont un typage faible en C. Sauf dans le cas de certaines fonctions spéciales telles que printf et scanf , le compilateur ne fait aucun effort pour vérifiez que vous leur transmettez les types d’arguments corrects.

Dans votre cas, la fonction attend un double paramètre, mais vous essayez de passer un int . Le compilateur ne fait pas de promotion ici de int à double , ce qui entraîne un comportement non défini. Vous devez toujours indiquer ici une valeur double , sous la forme d’une valeur à double constante explicite telle que 1.0 , ou effectuez la conversion à l’aide d’une conversion de type.

Eh bien, 3 et 1 sont des entiers et non des doubles. Leur représentation binary de ces nombres est différente de celle de 3.0 et 1.0 .

 var(1,3.9); var(1,1.2); var(1,5.7); $ ./a ac,17,Sep 25 2012 func: 18 3.900000 1.200000 5.700000