2012-10-15 9 views
1

如果我調用va_arg的次數少於可變參數中傳遞的參數次數,它是未定義的行爲嗎?調用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; 
} 

請問該程序導致未定義的行爲?

回答

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是重要的,但。

0

va_arg定義爲按照它們傳遞的順序返回參數。如果你稱它的次數少於參數,那麼你會忽略任何額外的參數。

+0

這個答案有點「半正確」。雖然調用'va_arg'的次數並不重要(只要不是太多),OP的程序*確實會導致未定義的行爲。 –