首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

這個經典的代碼。解决方法

2012-02-28 
這個經典的代碼。。。。。。。。。#includeiostreamintmain(intargc,char**argv){charch[3]ch[4]a printf( %d

這個經典的代碼。。。。。。。。。
#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]);
也会崩溃的..

查了一些,感觉是访问了栈顶以上的数据..具体还是不很清楚..继续看

热点排行