2013-04-16 27 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'的次数。 –