varargs功能崩溃

时间:2010-08-06 15:56:20

标签: c++ crash variadic-functions

我有一个函数应该根据格式字符串获取可变数量的参数(使用varargs):

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&lt;&lt; va_arg(listPointer,char *)&lt;&lt; ENDL;

    cout&lt;&lt; va_arg(listPointer,char)&lt;&lt;结束;

打印“a”。

我做错了什么?

1 个答案:

答案 0 :(得分:6)

应该是va_start(listPointer, argformat)va_start最后一个命名参数作为其第二个参数。 (从技术上讲,这意味着您根本不需要预先计算参数字符串的长度 - 只需迭代字符(随着时间的推移迭代varargs),直到到达字符串的末尾。)

相关问题