Impossible d’implémenter une fonction avec des arguments variables

J’essayais d’implémenter une fonction avec des arguments variables, mais j’obtenais des valeurs incohérentes en sortie.J’ai déjà fait référence à cet article avant d’essayer d’implémenter moi-même. .

/* va_arg example */ #include  /* printf */ int FindMax (int n, ...) { int i,val,largest,*p; p=&n; p+=sizeof(int); largest=*p; for (i=1;ival)?largest:val; } return largest; } int main () { int m; m= FindMax (7,702,422,631,834,892,104,772); printf ("The largest value is: %d\n",m); return 0; } 

Le problème est que vous essayez d’accéder directement aux emplacements de la stack où vous supposez trouver vos arguments. Les conventions d’appel sont spécifiques à la machine et parfois au compilateur. Elles constituent un détail d’implémentation sur lequel vous ne pouvez jamais compter . Par conséquent, vos arguments ne sont probablement pas trouvés sur la stack où vous supposez qu’ils se trouvent. En termes de C, votre code appelle simplement un comportement indéfini

Solution: utiliser stdarg.h pour accéder aux arguments, c’est pour cela qu’il est.

 #include  /* printf */ #include  int FindMax (int n, ...) { va_list ap; int i,val,largest; va_start(ap, n); // <- ap is the argument pointer, this initializes it // based on the last non-variadic argument. largest=0; while (n--) { val = va_arg(ap, int); // <- fetch argument and advance pointer largest=(largest>val)?largest:val; } va_end(ap); // done with argument pointer return largest; } int main () { int m; m= FindMax (7,702,422,631,834,892,104,772); printf ("The largest value is: %d\n",m); return 0; }