【发布时间】:2014-01-03 10:44:53
【问题描述】:
我试图了解可变参数函数的工作原理。我读过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) 只返回一个指向堆栈中更深的元素的指针。
【问题讨论】:
-
你对参数的数量“撒谎”。
-
函数 (printf) 的参数没有定义的评估顺序(没有序列点),因此您的个人
va_arg的评估没有特定的顺序,而不是从左到右.您应该首先将每个va_arg存储在一个变量(或数组)中,然后在 printf 调用中使用它。 -
我认为大多数实现倾向于从右到左评估参数。试试
#include <stdio.h> int main() {int n=1;printf("%d %d %d\n",n++,n++,n++);}。它很可能会打印3 2 1。 -
不过,未定义的行为是未定义的行为,不应依赖。
标签: c variadic-functions