1


1

可変引数関数のクラッシュ

私は、フォーマット文字列に基づいて可変引数(可変引数を使用)を受け取ることになっている関数を持っています:

void va(const char* name, const char* argformat, ...) {
    int numOfArgs = strlen(argformat);

    std::string buf = "asdf";

    va_list listPointer;
    va_start(listPointer, numOfArgs);
    char* blah;

    for(int i = 0; i < numOfArgs; i++) {
            switch (argformat[i]) {
                    case 's':
                            cout << va_arg(listPointer, char*) << endl;
                            break;
                    case 'i':
                            cout << va_arg(listPointer, int) << endl;
                            break;
                    case 'f':
                            cout << va_arg(listPointer, float) << endl;
                            break;
                    case 'b':
                            cout << va_arg(listPointer, bool) << endl;
                            break;
                    default:
                            break;
            }
    }

    va_end(listPointer);

    return;
}


int main() {
    va("fe", "sb", "asdf", true);

    return 0;
}

それはクラッシュします。

+ cout << va_arg(listPointer、char *)<< endl;を変更した場合+ to + cout << va_arg(listPointer、char)<< end;

「a」を出力します。

何がおかしいのですか?

1 Answer


6


`va_start(listPointer、argformat)`でなければなりません。 `va_start`は、_lastというparameter_を2番目の引数として受け取ります。 (厳密には、引数文字列の長さを事前に計算する必要はありません。文字列の最後に到達するまで文字を繰り返し処理します(移動中に可変引数を繰り返し処理します)。)