Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C stdarg.h不处理字符指针_C_Pointers_Char_Arguments - Fatal编程技术网

C stdarg.h不处理字符指针

C stdarg.h不处理字符指针,c,pointers,char,arguments,C,Pointers,Char,Arguments,所以我一直在尝试用stdarg来表示不确定的参数。对于int,它工作得很好,但现在我正在尝试使用char指针。这是我的代码: void updateValue(char *parameter, parameterTypes type, ...) { va_list arg_list; U32 value; char* stringValue; va_start(arg_list, type); value =

所以我一直在尝试用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");
前两个参数用于列表中参数的名称及其类型。这在没有标准设置的情况下工作,因此这不是问题。

使用这两行

value = va_arg(arg_list, U32);
stringValue = va_arg(arg_list, char*);
您尝试从堆栈中获取两个值,但只为va列表传递一个参数。这意味着,当您尝试获取字符串时,您将跳出堆栈上的参数列表,并获得一个看似随机的指针。

这两行

value = va_arg(arg_list, U32);
stringValue = va_arg(arg_list, char*);
您尝试从堆栈中获取两个值,但只为va列表传递一个参数。这意味着,当您尝试获取字符串时,您将跳出堆栈上的参数列表,并获得一个看似随机的指针。

您应该使用
type
参数来计算变量部分的类型。当只传递一个参数时,您似乎同时访问了
U32
char*

你需要像这样的东西:

if( type == stringType )
{
  char *stringValue = va_arg(arg_list, char *);
  print("got string '%s'\n", stringValue);
}
else if( type == u32Type )
{
 /* ... */
}
您应该使用
type
参数来计算变量部分的类型。当只传递一个参数时,您似乎同时访问了
U32
char*

你需要像这样的东西:

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

嗯,我改变了它,它确实起作用了,但这不是让整个库变得毫无意义吗?因此,当我想传递一个int或char*?@flexzican时,我不能使用这个函数。
va_arg
“函数”修改
arg\u列表,在调用它时指向下一个参数。每次调用
va_arg
都会得到下一个参数,它使用类型来决定要修改多少
arg_list
。嗯,我更改了它,它确实可以工作,但这不是使整个库毫无意义吗?因此,当我想传递一个int或char*?@flexzican时,我不能使用这个函数。
va_arg
“函数”修改
arg\u列表,在调用它时指向下一个参数。每次调用
va_arg
都会得到下一个参数,它使用该类型来决定要修改的
arg_list