可変引数リストを使用する関数 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 に他のがらくたが表示されるようになりましたが、違いはありません...