变量参数崩溃的 C 函数
C function with variable arguments crashing
我写了一个函数来帮助我调试一个项目:
static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
char szPrefix[80], szOut[256];
va_list ap;
va_start(ap, cpszFormat);
sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %sn"
, __DATE__, __TIME__, uintLineNo, cpszFormat);
vsprintf_s(szOut, sizeof(szOut), "%s", szPrefix, ap);
va_end(ap);
OutputDebugString(szOut);
}
此函数的示例:
outputDebug(__LINE__, "AdapterInit(%s)", "Test");
格式字符串 AdapterInit(%s)
之后的所有内容都是可选的,我已经单步执行了该函数,它毫无问题地构造了szPrefix
,例如,这将包含类似的东西; Apr 18 2018 07:33:07 01492 Adapter(%s)
下一行vsprintf
导致异常:
Unhandled exception at 0x0781e9ee (msvcr90d.dll) in ....
我看不到我做错了什么,我该如何解决这个问题?
[编辑] 问题出在vsprintf
开始的行中,删除不必要的%s
解决了问题。
工作解决方案:
static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
char szPrefix[80], szOut[256];
va_list ap;
va_start(ap, cpszFormat);
sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %sn"
, __DATE__, __TIME__, uintLineNo, cpszFormat);
vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);
va_end(ap);
OutputDebugString(szOut);
}
如果我收集正确,您将szPrefix
构造为新的格式字符串(通过将cpszFormat
插入其中,添加前缀(。因此,对vsprintf_s
的调用应该使用它,而不是%s
.即
vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);
你为szPrefix
选择的尺寸(80(也是相当乐观的。可能值得将其增加一两个档次。
相关文章:
- 内联映射初始化的动态atexit析构函数崩溃
- C++设置器函数崩溃
- 在C++中删除指针数组时析构函数崩溃
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- 分配内存并在回调时调用C++的 Rust 函数崩溃
- MEX文件实现特征库伪内函数崩溃
- C :复制构造函数崩溃
- 创建'new'实例可以解决析构函数崩溃问题?
- wglCreateContextAttribsARB函数崩溃
- OpenCV 均值函数崩溃,掩码从 OpenCV 阈值函数创建
- 使用Armadillo类型的lambda函数崩溃的未知原因
- 空析构函数崩溃程序:C++
- avformat_open_input函数崩溃
- boost::任何析构函数崩溃
- VS CTP 14的std::线程析构函数崩溃
- 使用std::enable_shared_from_this时,析构函数崩溃
- C++继承虚拟函数崩溃
- 分配空终止符时Windows剪贴板函数崩溃
- 从函数崩溃返回,仅在代码中的某个点之后
- 模板函数崩溃