读书人

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

发布时间: 2012-02-05 12:07:15 作者: rapoo

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

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就是堆栈检查!

读书人网 >C++

热点推荐