为什么我得到运行时检查失败#2 - 围绕变量'x'的堆栈被破坏?
问题描述:
这让我疯狂。我有遗留的代码,我添加了更多的条件(如下)。我解析一个字符串并检索数据。这是如何在遗留代码中完成的,因此我没有改变风格。为什么我得到运行时检查失败#2 - 围绕变量'x'的堆栈被破坏?
WORD wPSM = 0;
double dblPST = 0;
WORD wSDB = 0;
if(-1 != str.Find("PSM="))
{
nNumScanned = sscanf_s((LPCTSTR) str, "PSM=%u", &wPSM);
}
if(-1 != str.Find("PST="))
{
nNumScanned = sscanf_s((LPCTSTR) str, "PST=%lf", &dblPST);
}
if(-1 != str.Find("SDB="))
{
nNumScanned = sscanf_s((LPCTSTR) str, "SDB=%u", &wSDB);
}
我得到错误Run-Time Check Failure #2 - Stack around the variable 'wPSM' was corrupted
。如果我评论这三行,我不会得到这个错误。 str
是CString,它确实包含期望值。
sscanf_s
上面的语法可能会导致这种错误吗?
注意这是C++项目与VS2010,我已经将其标记c只画出因为对于一个16位无符号整数sscanf_s
答
WORD
is a define的注意力,让你的程序有未定义行为因为sscanf_s
期待一个无符号整数。
您需要调用sscanf_s
时的%hu
修饰符。
+0
谢谢,就是这样! – zar 2014-10-07 14:46:56
您显示的代码中没有'wPST'变量。 – sth 2014-10-07 14:37:16
a)哪3行? b)wPST声明在哪里,它不在你的代码片段中 – 2014-10-07 14:38:26
你用'%u'扫描(所以很可能收集32位数据 - 如果不是64位)到'WORD'(16位)变量。那些额外的16位进入他们不属于的堆栈的一部分。 – 2014-10-07 14:38:27