我正在试验可变参数列表并看到一些奇怪的结果...
我正在测试的代码是:
#include <stdio.h>
#include <stdarg.h>
void foo(int param1, int param2, ...)
{
int param3 = 0;
va_list ap;
va_start(ap, param2);
param3 = va_arg(ap, int);
va_end(ap);
printf("param3: %d\n", param3);
}
int main(void)
{
foo(1,1);
foo(1,1,42);
}
该片段的输出是:
param3: -1073748472
param3: 42
对于第二次调用:“foo(1,1,42)”,一切似乎都按预期工作。
对于第一次调用:'foo(1,1)',结果看起来像一个未初始化的 int,尽管我在函数开头第一次初始化它时确实将它设置为 0。
我希望能够依赖这样一个事实,即如果未调用参数,结果变量的值应为 0。我原以为 va_arg() 会足够明智地处理这个问题,但事实并非如此。
有什么建议可以解决这个问题吗?
非常感谢。
最佳答案
首先,我不明白您将 param3
初始化为零这一事实应该有什么关系,因为无论如何您稍后都会覆盖该值。
其次,尝试“提取”一个不存在的可变参数会产生未定义的行为。因此,处理该问题的唯一方法是不尝试提取不存在的参数。没有办法检测参数是否存在。调用者有责任通知函数它可以安全地提取多少可变参数。
关于C: 使用 stdarg.h 的可变参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978519/