如果调用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/

10-12 19:19