好老的帖子……
上面的代码越界的可能性不大,毕竟是分配以后的。
估计是因为某些原因在结构体中写入了坏数据造成的……
顺便在这里给大家提个醒
如果你的数组是在函数中申请的,请一定要注意:
数组一定要初始化!
因为第一次你跟踪的时候申请的数组中的所有元素肯定是0没错……不是教课书上说的随机数,Lava初始化的时候把整个内存区都清空了,所以这时候程序可能正确。
但是如果这个函数执行完了,出去兜了一阵回来(大多数是开始读入数据画图)这时候再执行回来这段数组中还剩什么就很难说了……计算结果还是有的,只是这个结果远远大于你的规定范围……
有经验的同志可以算一算如果一张40*40的地图你算出来的坐标是3000*3000是什么结果……放到画图函数里面不越界才怪~~
顺便说一句,在Lava里面数组是没有越界的概念的,比如在程序一开始,你申明
char a[10];
你写a[3000]一样不会出错……
另外在废话一点:
Lava的堆和栈是公用的,堆是从0开始放的(不过前面似乎还有什么东西)
栈是从最后开始倒着放的
与其他语言不同的是,系统结构(int,char什么的)是放在堆里而不是栈里,栈里只是存储函数的返回地址和参数(是不是放参数没有确认,不过根据“经验(呵呵)”应该是,但是也不确定啦,没时间研究,但是返回地址是确认的)也就是说函数调用层次越多,也会把内存消耗越多,这时候有几个现象值得大家去尝试一下:
1。使用递归算法把栈顶写到以分配的堆里……看看会不会有什么有趣的反应
2。经过精确计算,申明int a; a=20000;这个值是乱写的,反正就是栈的相应地址,然后……用*a把栈改掉,也就是把函数的返回地址改了,然后……你这个函数退出的时候……嘿嘿嘿
3。这个才是最有适用价值的。承接2,如果你可以明确地知道栈顶指针的存放点(可疑地点:栈底)你可以直接修改这个值(比如加上一点)然后再手工在栈顶写入你要退回的函数地址……退出的时候就会直接跳到这个函数了!
激动人心吧~但是事实上是不太可能的,因为:
1。栈顶指针很可能在20K以外(其他机型递减)这样写出来的程序不能通过验证……
2。也是最重要的一点……函数地址怎么确定?我不知道……我唯一想到的办法是在程序初始化的时候调用相应的函数(当让要加上一个参数,让程序知道不用真正执行,只是记录地址而已)然后再函数中执行一个地址记录函数,让这个地址记录函数读取栈顶数据,并且记录下来,这样或许能行……
顺便说一句,这些只是根据常识的一些估计方法,我也没有什么兴趣去尝试……有志愿者的话可以尝试一下,说不定明天的Lava高手就是你哦~~~因为你解决了在Lava里面实现函数指针的“伟大”课题!
什么?看不明白?我只是说说,何必那么认真呢?
什么?早就知道了?我只是说说~何必那么认真呢?
[em01][em01][em01]
[此贴子已经被作者于2005-6-21 2:02:39编辑过]
|