0

所以我一直在尝试将 stdarg 用于不确定的参数。对于 int 它工作得很好,但现在我正在尝试使用 char 指针。这是我的代码:

    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 设置的情况下工作,所以这不是问题。

4

2 回答 2

3

您应该使用type参数来确定变量部分的类型。当只传递一个参数时,您似乎同时访问aU32和 a 。char*

你需要类似的东西:

if( type == stringType )
{
  char *stringValue = va_arg(arg_list, char *);
  print("got string '%s'\n", stringValue);
}
else if( type == u32Type )
{
 /* ... */
}
于 2013-04-16T08:53:20.047 回答
2

有了这两行

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

您尝试从堆栈中获取两个值,但您只为 va-list 传递了一个参数。这意味着当您尝试获取字符串时,您将超出堆栈上的参数列表,并获得一个看似随机的指针。

于 2013-04-16T08:49:56.720 回答