我正试图理解变参函数的工作原理。我读了man stdarg
并编写了以下代码:
#include <stdarg.h>
#include <stdio.h>
int sum(int count, ...){
va_list lst;
va_start(lst, count);
printf("First=%i,Second=%i,Third=%i, Fourth=%i, Fifth=%i\n",va_arg(lst,int),va_arg(lst,int),va_arg(lst,int),va_arg(lst,int),va_arg(lst,int));
}
int main(){
sum(1,2,3,4);
}
编译和运行后,我得到了以下输入:
First=0,Second=134513840,Third=4,Fourth=3,Fifth=2
。
我不理解这个。我期望的是First=2,Second=3,Third=4
,而Fourth/Fifth的值未定义,因为在函数调用之后,参数从右向左推入堆栈,va_arg(lst, int)
只返回一个指向深层堆栈元素的指针。
va_arg
是以无特定顺序进行求值的,而不是从左到右。您应该首先将每个va_arg
存储在变量(或数组)中,然后在printf调用中使用它们。 - Bernd Elkemann#include <stdio.h> int main() {int n=1;printf("%d %d %d\n",n++,n++,n++);}
。它很可能会打印出3 2 1
。 - halfbit