C ++ - va_list Bad Pointer

时间:2012-07-06 23:33:05

标签: c++ variadic-functions

我在一个案例的''下面得到了一个错误的指针(0xcccccccc)的例外情况:

string Logger::format(const char *str, va_list args)
{
    ostringstream output;

    for(int i = 0; i < strlen(str); ++i)
    {
        if(str[i] == '%' && str[i+1] != '%' && i+1 < strlen(str))
        {
            switch(str[i+1])
            {
            case 's':
            {
                char *temp = va_arg(args, char*);
                output << temp;
                break;
            }
            case 'i':
            {
                int temp = va_arg(args, int);
                output << temp;
                break;
            }
            case 'd':
            {
                double temp = va_arg(args, double);
                output << temp;
                break;
            }
            case 'f':
            {
                float temp = va_arg(args, float);
                output << temp;
                break;
            }
            default:
                output << str[i];
            }

            i++;
        }
        else
        {
            output << str[i];
        }
    }

    return output.str();
}

上述函数由此调用:

void Logger::debugFormat(string message, ...)
{
    const char* cstr = message.c_str();

    va_list args;
    va_start(args, cstr);

    record(DEBUGGING, format(cstr, args));

    va_end(args);
}

我在我的所有代码中以这种方式调用上述方法

Logger::debugFormat("Loading Image %s", path.c_str());

任何其他类型(int,double,float)都可以正常工作。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:4)

您没有正确使用va_start。第二个参数应该是函数参数,之后变量参数列表(由...表示)开始。也就是说,它应该是:

va_start(args, message);