2013-12-17 35 views
3

在該示例中此代碼編譯雖然它不會產生正確的結果:當使用另一個函數封裝printf和vfprintf時,這種差異的原因是什麼?

void encapsulatePrintf(const char *str, ...) { 
    va_list argptr; 
    va_start(argptr, str); 
    printf(str, argptr); 
    va_end(argptr); 
} 

,然後在主:encapsulatePrintf("test str: %i - %s", 22, "test2");

  • 結果是隨機字節形式某處存儲:test str: 2293428 - á "

但是當我將功能從printf更改爲vfprintf(stdout, str, argptr);

  • 所有的輸出都可以。

這是怎麼回事?

回答

8

printf()不採取va_list作爲參數,而是論據,而​​變量列表需要一個va_list作爲參數,而不是參數的變量列表。基本上,使用

printf(str, argptr); 

你調用未定義行爲時,你叫printf():第一個參數許諾,你會傳遞一個intchar*,但你通過了,而是一個va_list。傳遞給printf()的參數類型必須與格式字符串中的規範匹配。

相關問題