如果调用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;
}
那个程序会导致未定义的行为吗?
最佳答案
您的程序确实会导致未定义的行为,但不是因为您使用va_arg
的方式这只是忽略了额外的论点,所以把它包括进来似乎是浪费打字。
导致未定义行为的原因是您没有在该函数中包含va_end
。
从规范(7.15.1.1va_arg
宏):
每次调用va_arg
宏都会修改ap
,以便依次返回连续参数的值…如果没有真正的下一个论点行为没有定义。。。
从7.15.1.3开始,va_end
宏:
…如果在返回之前未调用va_end
宏,则行为未定义。
没有提到必须给va_arg
打一定次数的电话。如您所见,va_end
很重要。
关于c - 调用va_arg的次数少于传递的参数数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12890406/