VS2010中基于控制台的Win32程序,输出正常,当关闭程序后,会弹出错误对话框,显示“Stack around the variable 'XXX' was corrupted.”如图1所示。
图1 报错窗口
在出错代码中,首先定义了一个名为strPrint的结构,该结构包含了两个字符指针。在main()函数中定义了一个Print结构的对象a和一个Print结构的指针Print,并将该指针的值赋值为a的地址。接下来通过指针Print对内存进行操作。
#include "stdlib.h"
#include "string"
typedef struct Print{
char * FileName;
char * PrintName;
}StrPrint;
int _tmain(int argc, _TCHAR* argv[])
{
StrPrint a;
StrPrint *Print;
Print=&a;
Print->PrintName="123";
Print->FileName="456";
printf("%s,%s\n",Print->PrintName,Print->FileName);
Print++;
Print->PrintName="abc";
Print->FileName="def";
system("pause");
return 0;
}
通过调试程序可知,a的地址为0x006FFC3C,0x006FFC3C~0x006FFC43间的8个字节保存了a的FileName和PrintName值;在对Print进行加1后,Print的值变为0x006FFC44,0x006FFC44~0x006FFC4B间的8个字节保存了Print加1后对应的FileName和PrintName值,如图2和图3所示。
图2 内存栈示意图
图3 内存栈值
报错信息“Stack around the variable 'a' was corrupted.”的意思是“变量a周围的栈被破坏了”。正如图2和图3所示,程序中只申请了a的内存,即0x006FFC3C~0x006FFC43间的8个字节,但是却对另外的0x006FFC44~0x006FFC4B间的8个字节进行了修改,说明a周围的栈被破坏了。
如果需要修改strPrint结构的两个变量,则需要定义两个变量。将代码修改如下即可
StrPrint a[2];
StrPrint *Print;
Print=a;
......