典的代。。。。。。。。。
#include <iostream>
int main(int argc, char** argv)
{
char ch[3];
ch[4] = 'a ';
printf( "%d ",ch[4]);
return 0;
}
在linux 下用:gcc,g++,gnu都可以正常行
在windows下 :vc6.0,vc.net2003,vc.net2005,gnu for win32,lcc.(32位平)
都通,而且能正打印 97
是器?是操作系?
[解决办法]
既然知道不同平台不同编译器结果不同,那你前面写什么//11,12,40你检测过的,想说明啥?这些检测不能说明任何问题。这就是一段错误的代码,数组访问越界了。只不过修改了的内存数据有可能在某些情况下没引发异常而已,搞清楚ch[6],ch[11],ch[12]可能指向哪分析出错的原因稍微有帮助,其他的实在是没有太多好说。
[解决办法]
是碰巧。
上述程序实质是破坏了调用main前的堆栈栈顶的一个字节,而那正好是放的是返回地址,所以我跟踪下去的时候,程序跳到了前面,彻底乱套了。正常的情况下,main的ret后,是应该返回到CrtStartup下一条语句的。
但是我看到debug模式下面,微软是做了大量的工作,比如每个函数返回前,调用了RTC_CheckStackVar和RTC_CheckEsp来检查栈,所以虽然可以侥幸利用变量之间的空隙通过release,却逃不过RTC_CheckStackVar的法眼。
[解决办法]
学习来的.
我试了用ch[5]就不行了...在VC6Debug里面显示的结果是-64,然后程序就崩溃了..
把值调成楼主那样也会出错就是
char ch[3];
ch[5]= 'a ';
printf( "%d ",ch[6]);
也会崩溃的..
查了一些,感觉是访问了栈顶以上的数据..具体还是不很清楚..继续看