1

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;
}

そのプログラムは未定義の動作を引き起こしますか?

4

2 に答える 2

7

あなたのプログラム未定義の動作を引き起こしますが、使用方法が原因ではありませんva_arg。それは余分な引数を無視しているだけなので、それを含めるのは入力の無駄のようです。

未定義の動作の原因はva_end、その関数に含まれていないことです。

仕様から ( 7.15.1.1 The va_argmacro ):

va_argマクロを呼び出すたびにap、連続する引数の値が順番に返されるように変更されます。...実際の次の引数がない場合...動作は未定義です...

そして7.15.1.3からva_endマクロ

...va_endリターンの前にマクロが呼び出されない場合、動作は未定義です。

va_arg特定の回数呼び出す必要があることについては言及されていません。ただし、ご覧のとおり、va_endは重要です。

于 2012-10-15T06:35:45.113 に答える
0

va_arg渡された順序で引数を返すように定義されています。呼び出し回数が引数よりも少ない場合、余分な引数は単純に無視されます。

于 2012-10-15T06:36:47.200 に答える