易码技术论坛

 找回密码
 加入易码
搜索
查看: 425106|回复: 8

[问题]关于Lava的函数的内存分配

[复制链接]
发表于 2007-5-11 20:07:05 | 显示全部楼层
反汇编解释器可以知道是有清零的。
这里i是直接分配是固定空间的虚拟地址,tmp分配的是动态空间的虚拟地址。
 楼主| 发表于 2007-5-12 08:04:42 | 显示全部楼层
LS可以看到,i是固定地址,但是计算出来的tmp[2]的值在第二次调用的时候并没有变化,所以数组tmp应该没有初始化。

我是这么猜想的。
发表于 2007-5-12 09:06:32 | 显示全部楼层
具我所了解。LAVA在分配内存时是这样的:
函数返回信息(五字节)
后面跟的就是当前函数中的局部变量的地址。
如果再调用。就在当前最后一个局部变量的地址后紧接着保存下一个函数的返回信息。然后是下一个函数中的局部变量。以此类推。我也发现并没有清0;
所以我在每一个函数中对局部变量都是进行过初始化的:
如:
char word()
{
char a[23][56];
char b[128];
int c,d;
long e;
memset(a,0,23*56);
memset(b,0,128);
c=0;
d=0;
e=0;
.........................
}
发表于 2007-5-12 09:15:09 | 显示全部楼层
可以直接memset(a,0,23*56+128+8);
 楼主| 发表于 2007-5-12 09:32:17 | 显示全部楼层
Yan大哥是直接初始化内存分配地址的吧?

那这样做很安全咯?
发表于 2007-5-12 09:59:25 | 显示全部楼层
这当然要谨慎使用
发表于 2007-5-12 10:24:18 | 显示全部楼层
函数所使用的内存是在堆栈中的,一个函数当前使用的哪块内存和堆栈深度有关.
发表于 2007-5-17 12:06:38 | 显示全部楼层
局部变量当然不会初始化,这是常识
 楼主| 发表于 2007-5-11 19:31:46 | 显示全部楼层 |阅读模式
本来以为lava里面的函数调用是会自动先清零(也就是初始化)的。
最近写AI的搜索函数才注意到其实不是这样的(还得我以为是算法问题,找BUG找到累死)。

下面有一段程序可以检验这个问题:
  1. char i;
  2. void che()
  3. {char tmp[3];
  4. tmp[i]=2;
  5. printf("%d\n",tmp[2]);
  6. return;
  7. }
  8. void main()
  9. {SetScreen(1);
  10. i=2;
  11. che();
  12. i=1;
  13. che();
  14. Delay(1000);
  15. exit(0);
  16. }
复制代码
在实机上结果是2 2,
也就是说lava解释器是按照固定地址使用的内存,并没有进行初始化。
以后大家写程序就应该注意解释器的这个特性带来的影响。

不知道我想的对不对,希望大家能给我一个解释。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 14:04 , Processed in 0.009505 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表