tan*_*grs 1 c variadic-functions undefined-behavior
如果我调用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;
}
Run Code Online (Sandbox Code Playgroud)
该程序会导致未定义的行为吗?
您的程序确实会导致未定义的行为,但不是因为您使用的方式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很重要.