调用va_arg的次数少于传递的参数数量

时间:2012-10-15 06:33:31

标签: c undefined-behavior variadic-functions

如果我调用va_arg的次数少于可变参数函数中传递的参数数量,那么它是否是未定义的行为?

例如:

#include <stdarg.h>
void foo(unsigned n, ...) {
    va_list ap;
    int bar = 0;

    va_start(ap, n);
    if (n) bar = va_arg(ap,int);
    // Do something with bar
}

int main() {
    foo(2, 3, 4);
    return 0;
}

该程序会导致未定义的行为吗?

2 个答案:

答案 0 :(得分:7)

您的程序 导致未定义的行为,但不是因为您使用va_arg的方式。这只是忽略了额外的论点,所以包含它似乎浪费了打字。

导致未定义行为的原因是您未在该函数中包含va_end

来自规范( 7.15.1.1 va_arg):

  

每次调用 va_arg 宏都会修改 ap ,以便依次返回连续参数的值。 ......如果没有实际的下一个参数......行为是未定义的......

7.15.1.3 va_end

  

...如果在返回之前未调用 va_end 宏,则行为未定义。

没有提及必须拨打va_arg一定次数。如您所见,va_end很重要。

答案 1 :(得分:0)

va_arg被定义为按照传递的顺序返回参数。如果你调用它的次数少于参数,你将简单地忽略任何额外的参数。