1

可変引数リストを使用する関数 my_init(...) があります。このリストの長さは不明ですが、最大で 100 個あり、要素は常に文字配列 (単純な 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 に他のがらくたが表示されるようになりましたが、違いはありません...

4

1 に答える 1

1

の 2 番目の引数va_startは、最後に名前が付けられた関数パラメーターでなければなりません。つまり、標準的な使用法は次のとおりです。

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

    va_list vl;

    va_start(vl, arg2);

    // Stuff
}
于 2013-02-04T14:03:45.237 に答える