【发布时间】:2014-04-18 15:46:40
【问题描述】:
我不确定为什么会在以下代码中看到 EXC_BAD_ACCESS:
template <typename ArgType>
String Format(ArgType args, ...) const {
va_list argList;
va_start(argList, args);
// determine num of chars needed, don't store anything anywhere though!
size_t charsNeeded = vsnprintf(NULL, 0, ToStdString().c_str(), argList);
va_end(argList);
// print formatted string into buf
va_start(argList, args); // EDIT: new va_list here
char buf[charsNeeded];
vsprintf(buf, ToStdString().c_str(), argList);
va_end(argList);
return String(buf);
}
编辑:我可能应该提到代码应该这样使用:
String str = String("Hello, %s!").Format("World");
我应该提到 String 是一个小型包装类,它有一个 ToStdString() 方法,该方法返回一个 std::string 成员 var。
vsnprintf() 调用出现段错误,但我不知道为什么!
【问题讨论】:
-
对
vsnprintf的调用可能由于格式说明符与传递给Format的数据不匹配而失败。 FWIW 可变长度数组 (char buf[charsNeeded]) 不是标准 C++。 -
您是否打算忽略使用
args处理anything? ?即使调用成功,VLA 也只有一个字符,因为charsNeeded不会包含终止符所需的 +1。为了理智起见,将ToStdString()填入实际的std::string,然后使用itsc_str()。无论如何,我认为没有理由使用 VLA。使用std::vector<> -
你是什么意思“的” vsnprintf 调用?有两个,如果 charsNeeded 太大,您可能会遇到一些依赖于操作系统的故障 - 在 mac 上可能是 EXC_BAD_ACCESS 吗?
-
@loreb:只有一个调用
vsnprintf(),另一个调用vsprintf(),注意缺少n。 -
无关:但
arglist在vsnprintf()将返回后无效。
标签: c++ variadic-functions printf