我在一个案例的''下面得到了一个错误的指针(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)都可以正常工作。任何帮助表示赞赏。
答案 0 :(得分:4)
您没有正确使用va_start
。第二个参数应该是函数参数,之后变量参数列表(由...
表示)开始。也就是说,它应该是:
va_start(args, message);