我了解到此代码将在终端中打印 10、30、60。
#include <stdio.h>
void add(int num, ...);
int main(int argc, char const *argv[])
{
int a=10, b=20, c=30;
add(1, a);
add(2, a, b);
add(3, a, b, c);
return 0;
}
void add(int num, ...)
{
int* p = NULL;
p = &num + 1;
if (num == 1)
printf("%d n", p[0]);
else if (num == 2)
printf("%d n", p[0] + p[1]);
else
printf("%d n", p[0] + p[1] + p[2]);
}
但是,它只打印奇数... :( 我只想在. 你认为我应该在哪里修复?
你不能仅仅通过获取最后一个给定参数的地址并添加到它来获得可变参数。 函数参数在堆栈上的布局方式(如果使用堆栈(取决于编译器和系统。 这就是为什么你会得到奇怪的数字。
可移植执行此操作的方法是使用如下所示的va_list
:
void add(int num, ...)
{
// the va_list used to retrieve the extra arguments
va_list args;
int i, sum = 0;
// use va_start to start processing arguments, passing in the last explicit argument
va_start(args, num);
for (i=0; i<num; i++) {
// extract the next argument with the given type
sum += va_arg(args, int);
}
// cleanup
va_end(args);
printf("%d n", sum);
}
有关更多详细信息,请参见标准达格手册页。