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

【帮帮忙啊】一个奇怪的有关问题

2012-02-05 
【帮帮忙啊!】一个奇怪的问题!本人编写了一个读取文本文件内容的练习小程序,程序可以正常读取内容,但在程序

【帮帮忙啊!】一个奇怪的问题!
本人编写了一个读取文本文件内容的练习小程序,程序可以正常读取内容,但在程序结束是就会出现下面的对话框

Debug   Error!

Program:   C:\1.exe
Module:
File:   i386\chkesp.c
Line:   42

The   value   of   ESP   was   not   properly   saved   across   a   function   call.   This   is   usually   a   result   if   calling   a   function   declared   with   one   calling   convention   with   a   function   pointer   declared   with   a   different   calling   convention.

(Press   Retry   to   debug   the   application)

搞定我摸不到头脑!
后来发现在要在程序的结尾处加上   exit(0);   这一段代码就不会出错了,可是别的程序不用加一样可以正常结束啊,为什么这个就要加呢?

帮帮忙啊!

[解决办法]
贴代码,肯定是某个地方越界了
[解决办法]
for(i=0;i <80;i++)
{
menu[i+3]=str[i]; //这里越界了,改一下看看是不是还有问题
}
[解决办法]
char menu[80];
改为
char menu[83];
试试!
[解决办法]
原因还看不出来吗?
你定义了char menu[80]
而for循环里在i=78的时候的时候
会执行
char menu[78+3]=...
超过了你定义的数组范围了阿~~
[解决办法]
menu[80]改成menu[81]依然会造成数组的下标越界
只是有的编译器在编译时不会执行检查,也就不会报错
所以尽量避免出现这样的引用
[解决办法]
exit()应该是调用ExitProcess这个API实施无条件终止程序的,从错误情况来看像是堆栈指针esp指向了无效地址,大概强制退出程序时释放了堆栈空间从而忽略了错误吧,期待高手指点。
[解决办法]
还有把 menu[80]改成menu[81]也不会出错了,但这样好不好!
-----------------
由于32位系统通常按4字节对齐,所以改为menu[81],menu[82],menu[83]或menu[84],menu都将占用84字节,根据楼主的程序中的menu[i+3]=str[i]; menu最大需要83字节所以改为menu[83]。

[解决办法]
但还想问一下 加了exit();在中间会起什么样的作用?为什么就不会出错了?
----------------------------------------

从你的描述来看是数组越界然后改写了保存的EBP值,然后file返回的时候vc发现了这个错误,所以挂起了你的进程,如果你加上exit(),exit在内部调用ExitProcess,这会强行中止你的进程,这个时候file没有机会返回了,所以也不会报错
[解决办法]
VC下的DEBUG版本会进行堆栈检查,Release版本不会。TC没有堆栈检查机制。
检查ESP应该算是堆栈检查吧,对这些东西,只是知道一点点,不知道说的对不对。
[解决办法]
esp就是堆栈检查!

热点排行