为什么我得到运行时检查失败#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

+0

您显示的代码中没有'wPST'变量。 – sth 2014-10-07 14:37:16

+0

a)哪3行? b)wPST声明在哪里,它不在你的代码片段中 – 2014-10-07 14:38:26

+2

你用'%u'扫描(所以很可能收集32位数据 - 如果不是64位)到'WORD'(16位)变量。那些额外的16位进入他们不属于的堆栈的一部分。 – 2014-10-07 14:38:27

WORD is a define的注意力,让你的程序有未定义行为因为sscanf_s期待一个无符号整数。

您需要调用sscanf_s时的%hu修饰符。

+0

谢谢,就是这样! – zar 2014-10-07 14:46:56