变量参数列表未知长度的问题

时间:2013-02-04 14:02:36

标签: c variadic-functions

有一个使用变量参数列表的函数my_init(...)。此列表的长度未知,但最多为100,元素始终为char数组(表示纯C字符串)。

这就是我尝试解码它们的方式:

void my_init(...)
{
    va_list vl; 
    int     tagCnt,tagLen=100; 
    char   *listTag,*listValue;

    va_start(vl,tagLen);
    for (tagCnt=0; tagCnt<50; tagCnt++)
    {
        listTag=va_arg(vl,char*);
        if (listTag==0) break;
        listValue=va_arg(vl,char*);

        ... // do some usefult things here
    }
    va_end(vl);
}

...我用这种方式调用这个函数:

my_init("tag1","value1",
        "tag2","value2",
        0);

所以总是有对,列表的末尾用0标记。不幸的是my_init()失败,在调用va_start()之后vl包含一些与输入参数和调用va_arg()无关的垃圾返回无效指针。那我的代码有什么问题?

上面给出的代码有点缩短,所以可能无法编译......

谢谢!

=============================================== ===================================

编辑:

我更改了代码并以这种方式调用:

void my_init(int dummy,...)
{
    va_list vl; 
    int     tagCnt,tagLen=100; 
    char   *listTag,*listValue;

    va_start(vl,dummy);
    for (tagCnt=0; tagCnt<50; tagCnt++)
    {
        listTag=va_arg(vl,char*);
        if (listTag==0) break;
        listValue=va_arg(vl,char*);

        ... // do some usefult things here
    }
    va_end(vl);
}

my_init(0,
        "tag1","value1",
        "tag2","value2",
        0);

独立于使用的头文件,我现在在我的vl中获得其他垃圾,stdargs.h或varargs.h没有什么区别......

1 个答案:

答案 0 :(得分:1)

va_start的第二个参数必须是最后一个命名函数参数。换句话说,规范用法是:

void my_func(int arg1, float arg2, ...) {

    va_list vl;

    va_start(vl, arg2);

    // Stuff
}