不知道大家写程序的时候会不会发现有时候程序运行时会崩溃,然后就会出现一句这样的话:
Run-time check failure #2-stack around variable ## was corrupted(我使用的编程软件是vs2012)
通常这种情况大多数是因为我们的代码有逻辑错误,最普遍的问题就是产生了越界问题。
比如下面代码的例子:
int main()
{
char str[6]={};
char* str1="abcdefg";
strcpy(str,str1);//error,产生了越界
strcat(str,str1);//error,产生了越界
}
{
char str[6]={};
char* str1="abcdefg";
strcpy(str,str1);//error,产生了越界
strcat(str,str1);//error,产生了越界
}
在这个代码中,我们用到了头文件string.h中两个函数,这个函数确实也是存在越界的问题,在上面的代码中我str不够大,不能完全接受str1里的东西,所以在运行时,vs会报一个这样的错误
这个就是典型的越界问题,因为这两个函数确实是不太安全,大家可以用它的安全版本或者自己实现,如果嫌麻烦的话,一定要看清楚他们的要求,注意不要越界了。
这是能发现的明显的错误情况,但是我写2048这个小游戏的时候,在最后玩到格子里都放满了数据的时候,也会出现这个问题,但是我为了改这个bug挣扎了很久,一直没有发现问题在哪,我定义了两个数组,每个数组的访问都是检查检查再检查,特别是在i+1,i-1,j+1,j-1这些容易发生边界错误的地方,都没有检查出来问题。后来我上网看了很多大神的博客,发现他们在写一些程序的时候也会遇到这样的问题,特别是那种变量较多,消耗栈的空间较大的程序中更容易遇到这样的问题。如果你检查实在是觉得自己的程序没有问题可以试试下面的方法:
这是能发现的明显的错误情况,但是我写2048这个小游戏的时候,在最后玩到格子里都放满了数据的时候,也会出现这个问题,但是我为了改这个bug挣扎了很久,一直没有发现问题在哪,我定义了两个数组,每个数组的访问都是检查检查再检查,特别是在i+1,i-1,j+1,j-1这些容易发生边界错误的地方,都没有检查出来问题。后来我上网看了很多大神的博客,发现他们在写一些程序的时候也会遇到这样的问题,特别是那种变量较多,消耗栈的空间较大的程序中更容易遇到这样的问题。如果你检查实在是觉得自己的程序没有问题可以试试下面的方法:
3、在基本运行时检查点击默认值(因为关于栈的检查可能就是由于两者(/RTC1,等同于 /RTCsu) (/RTC1)这个限制栈的大小)
我的问题就是通过这个方法得到了解决。