2013-04-16 32 views
0

所以我一直在試圖使用stdarg的無限期參數。對於int它很好,但現在我正在用char指針來試試這個。這是我的代碼:stdarg.h不處理字符指針

void updateValue(char *parameter, parameterTypes type, ...) 
    { 
     va_list arg_list; 
     U32 value; 
     char* stringValue; 

     va_start(arg_list, type); 
     value = va_arg(arg_list, U32); 
     stringValue = va_arg(arg_list, char*); 
     va_end(arg_list); 
     printf("\n\n%s\n\n", stringValue); 
    } 

當我把這個功能我簡單地使用:

updateValue("name", stringType, "TestingVaArg"); 

前兩個參數是在列表中的參數,它的類型的名稱。這工作沒有stdarg設置,所以這不是問題。

回答

3

你應該使用type參數來找出可變部分的類型。您似乎訪問都只有 a U32char*,當只傳遞一個參數。

你需要的東西,如:

if(type == stringType) 
{ 
    char *stringValue = va_arg(arg_list, char *); 
    print("got string '%s'\n", stringValue); 
} 
else if(type == u32Type) 
{ 
/* ... */ 
} 
+0

ofcourse! thnx男人! – flexzican

2

有了這兩條線

value = va_arg(arg_list, U32); 
stringValue = va_arg(arg_list, char*); 

試圖從堆棧中得到值,但你只有通過一個參數爲VA-列表。這意味着當你嘗試獲取字符串時,你將會出現在堆棧中的參數列表之外,並得到一個看似隨機的指針。

+0

嗯,我改變了它,確實它的工作原理,但不這樣做這整個庫沒有意義?所以我不能使用這個時,我想傳遞一個int或char *? – flexzican

+0

@flexzican當調用它時,'va_arg'「函數」_修改'arg_list'指向下一個參數。每次調用'va_arg'時,都會得到下一個參數,並使用該類型來決定修改'arg_list'的次數。 –