打印

C51内存单元释放问题???????

[复制链接]
6106|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
soso|  楼主 | 2008-8-5 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不是说局部变量可以自动释放的吗???我的为什么不行??例如:大概写一
点,说明问题。。


key()   //定义一个函数
{
int a;

}
main()  //主函数
{
key();
while(1);

}
为什么我在key函数内每定义一个变量,KELL C51编译时就显示多使用一个DATA
单元???它不是局部变量吗??如果我好自己定义的函数,RAM肯定不够??

相关帖子

来自 2楼
chunk| | 2008-8-13 13:34 | 只看该作者

如果你有良好的汇编功底,

可以把C源码编译成汇编源码进行分析,你会对C语言有更深刻的理解。

现在各种程序设计语言教材都是“就事论事”型,讲汇编的从不提C,它告诉你汇编器支持“分段(也就是SEGMENT或SECTION或AREA之类的伪指令)”,它还告诉你每个段的名字可以自己定,但它给你的事例中却不会出现以“DATA”、“BSS”、“TEXT”、“IDATA”、“CONST”等命名的段。它也不说它那样分段有什么目的,仅仅是给你演示一下“汇编器允许你分段”。

讲C的几乎都无视你已经具有汇编基础,甚至鼓吹不用学汇编也能成为优秀的软件工程师。它一个条目一个条目地给你讲“集成开发环境”的每一个菜单项,却不给你说C编译器的命令行参数都是怎么回事。它告诉你LONG型整数加法只要一行语句就可以,却不告诉你C编译器如何处理这一行语句。也许它会多说一句“对8BIT处理器来说,4字节大整数的加法用汇编实现需要许多指令,通常要编一个子程序”,然而你却不知道这个8位CPU的C编译器也要求用一个汇编子程序做这种加法,只不过这个子程序已经有人写好放在了“LIB文件”中。

10楼的同学,别在收集那些书了,费钱费时。

使用特权

评论回复
板凳
aibxyz| | 2008-8-5 10:09 | 只看该作者

。。。。。

你只有一个函数自然看不出来了
你再弄一个知道了
局部变量释放,是指在其他无继承关系的函数内部,可重新使用
而不是说编译后局部变量就不占data

使用特权

评论回复
地板
soso|  楼主 | 2008-8-5 12:21 | 只看该作者

reentrant就可以释放变量

但是我把key() 改为key() reentrant就可以释放变量,,为什么???

使用特权

评论回复
5
soso|  楼主 | 2008-8-5 14:12 | 只看该作者

怎么没人会????

怎么没人会????

使用特权

评论回复
6
wxj1952| | 2008-8-5 14:22 | 只看该作者

开玩笑。

reentrant函数局部变量在堆栈区,不在data区!也许你应该看看SP的差别。

使用特权

评论回复
7
ayb_ice| | 2008-8-5 15:02 | 只看该作者

(可能)不同時使用的變量才能被覆蓋

照lz的意思,keil51局部變量不佔用空間了...

使用特权

评论回复
8
soso|  楼主 | 2008-8-5 16:30 | 只看该作者

key() 函数只使用一次

但是我的key() 函数只使用一次,,使用完后,它里面定义的变量还占用
单元空间呀???????????

使用特权

评论回复
9
wxj1952| | 2008-8-5 19:54 | 只看该作者

共享和覆盖。

何谓共享?连接器搜索整个程序中所有函数中局部变量占用DATA最多的那个函数A,以函数A为准开辟共享局部变量区。
例如函数A中说明了10个char类型局部变量,那么整个程序的共享局部变量区 就是10字节。其他所有函数的局部变量都共享这10字节DATA区。这个区相当于全局变量区了,它确实就是位于全局变量区(之后)。所以,即使你的函数A退出了,这个共享变量区仍然存在。它还要为其它函数使用。

释放是程序员的工作,你没有释放语句,它怎么会释放?

“全局变量”是不会释放的

使用特权

评论回复
10
soso|  楼主 | 2008-8-5 22:57 | 只看该作者

高手...谢谢了...哈哈

高手...谢谢了...哈哈

使用特权

评论回复
11
天雨粟| | 2008-8-12 20:25 | 只看该作者

感谢wxj1952

我收集了许多国内单片机方面的书,没有发现那本书对变量覆盖作出了如许明确解释的,谨受教!

使用特权

评论回复
12
赤铸| | 2008-8-12 21:45 | 只看该作者

C51 局部变量的处理和一般编译器不一样

普通 C 语言的局部变量是分配方式是“auto”,C51 所有变量的内层分配方式都是“静态”的(除了特殊说明的)
内层分配上,局部变量跟 static, exnten 变量都是一样的

对于 C51,所谓“局部”只体现在“作用域”上,作用域与内层分配是两回事

使用特权

评论回复
13
john_light| | 2008-8-12 21:54 | 只看该作者

很久不写了……

http://blog.21ic.com/user1/908/archives/2005/1985.html

使用特权

评论回复
14
zyok| | 2008-8-13 11:16 | 只看该作者

学习了...

使用特权

评论回复
15
Beet117| | 2008-8-13 12:13 | 只看该作者

精辟!

使用特权

评论回复
16
wxj1952| | 2008-8-13 20:35 | 只看该作者

15楼大侠能否借此机会多讲一些书上没有的东西?

我一直不清楚,汇编程序按照什么原则分段?或者说分段的作用。什么情况下需要分段?

推荐本书我自己看也行。先谢了。

使用特权

评论回复
17
天雨粟| | 2008-8-13 21:34 | 只看该作者

感谢15楼的指点

我学单片机,基本方法是先买相似内容的三本书,比较其异同,如果发现问题,则有两本书是同一说法,即取其说法,这样能解决大部分问题,仍然解决不了,通过做在Keil中实验,也可以做到知其然,如果有人能告诉我所以然,则此中大乐,有不能言者也.
16楼关心的问题正是我想弄清楚的问题.我现在能在C中调用汇编,但实在没有弄懂其机制.例如局部数据段与参数传递段的关系,我按文字上的逻辑推理,至少两本书说参数传递段是局部数据段的别名,但用这个说法套例程,又不能全然合龙,很想知道到底是怎么回事.正像16楼的老师说的,能不能用汇编语言的原理把这其中的道理说清楚?

盼望中ing.....

使用特权

评论回复
18
xj803| | 2008-9-11 11:54 | 只看该作者

记号

使用特权

评论回复
19
nemo109| | 2008-9-11 16:38 | 只看该作者

学习中

继续。。。。我学到了好多东西。。。我是一个刚入行的。

使用特权

评论回复
20
grady1125| | 2008-9-11 18:15 | 只看该作者

局部变量也占内存啊

照你那样说干脆全部用局部变量,内存都免了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

0

帖子

1

粉丝