C51 单片机 局部变量 问题

网上都说局部变量需要初始化 不然就会是随机数,但是我的局部变量就是0。还有就是网上都说局部变量会随着函数的结束而释放但是我的是再次调用该函数那个变量还是那个值 why?

这个问题也困扰过我,比如定时器中断里设置一个变量x,不设置初值,然后程序里放个x++。
结果就是那个x真的一直在加。
不过我没有去深究过,个人理解是,如果系统不缺空间的话,单片机就不会去清除空余的单元。

是不是这样我不清楚,但是分析如下:
我们自己用汇编写程序的时候,直接对RAM操作,如果不去清0,里面的数是永远不会变的。这说明,单片机本身是没有这种操作的。
如果说C语言编译过程中有加这种功能,也很难想象会在每个工作周期中不断的去检查哪些单元闲置的,并且对其清零。因为这样要占用很多CPU时间。
个人猜测,注意,是猜测!应该是当不得不要把某个物理单元划分给新的变量时,才会真的把旧变量清除掉。否则,哪怕是局部变量,对应的物理单元应该是一直不变的。
(以上有错,是我一开始写的,请看下面的分析为准)

一边写一边仔细回忆一下,大概知道了:

如果你写了一个函数,里面有5个变量。并且,这个函数你不去调用它。那么编译后你会发现程序多占用了5个字节的RAM。如果你调用它,有些情况下(程序特别长,变量特别多时)你会发现,程序里使用的RAM没增加!(多说明一下,为什么不调用它反而要占用空间呢?因为系统不知道这5个空间什么时候可以释放,那么定义了以后只好一直保留着。而如果你调用它了,什么时候有用什么时候没用是固定的,那么系统编译时就可以在该变量不被使用时把空间分配给其他变量,有点“分时复用”的意思。而且,如果你写了太多函数,里面有足够多的变量,然后这些函数统统都永不调用,编译时就会出错,提示你系统RAM不足)

这至少说明两点,
一、如果你定义了一个局部变量,那么系统就会一直留着空间给它以备使用。那么那个物理单元随时都是为“那一个”变量准备着的,它的值并不会清零。
二、当你程序使用了太多变量时,那么系统编译时会自动调节,在适当的时候释放物理单元给“不同的变量”使用,也就是同一个物理单元要被不同的局部变量用,这种时候才会出现你说的情况,那就是局部变量会被清零。

实际上平时写的程序都太短了,根本没用使用完系统的RAM,那么编译时自然不会做这个操作。
同样可以得出一个结论,正是因为单片机的RAM有限,才会导致局部变量不清除。对于电脑来说,空间近乎无限的,随时随地你都可以分配空间给变量用。但是51单片机就那么128字节,必须详细策划好如何分配,所以局部变量才有了自己固定的地盘。

说到这里,我相信你的问题我已经找到答案了,虽然都是我推测的,但是十之八九不会错。欢迎讨论!
哦,至于初始值为0,这个没啥啊,单片机复位以后,RAM就是0
书上没写,但是实际用都是这样
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-04
为了代码整体的安全,还是初始化一下。有时会被编译器初始化为0的,但不是总是。

C51 单片机 局部变量 问题
同样可以得出一个结论,正是因为单片机的RAM有限,才会导致局部变量不清除。对于电脑来说,空间近乎无限的,随时随地你都可以分配空间给变量用。但是51单片机就那么128字节,必须详细策划好如何分配,所以局部变量才有了自己固定的地盘。说到这里,我相信你的问题我已经找到答案了,虽然都是我推测的,但是十...

51单片机如何函数调用时局部变量存放
1、首先将51单片机连接在计算机上。2、其次使用计算机打开51单片机的系统设置。3、最后在系统设置中调节为函数调用局部变量存放即可。

51单片机静态局部变量问题>?
),该变量只在这个函数中有效,在其它函数中无法读取和改变它的值,当跳出这个函数后,它所占用的内存空间将被释放,留给其它局部变量用。如:unsigned char aaa(){ unsigned char b; …… return b;}还有一种变量,就是在函数里面定义,但是加了static前缀的,在离开该函数后他的值任然会...

51单片机变量初值。
如果是“C51”,并且使用默认的startup.a51启动文件(未手动修改)的话,那么在运行到main()之前、片内SRAM已经都初始化为0了。

51单片机,keil编译环境,我定义位变量为局部变量时为什么编译错误?_百...
看你用什么语言写了,如果用汇编的话不用定义,直接用就行了,如:p1.0、p2.2……如果用C编写的话,应该先把头文件加进来,#include<reg51.h>,加进来后,如果不定义端口的话:P1、P1^1,这里的P是大写的……当然也可以自己定义了……如:sbit R_A=P2^0;等等……...

C语言局部变量一定存放在栈区么?
在51单片机的情况下,局部变量还可以存放在寄存器当中的,声明如下:register int count; \/\/count局部变量就存放在寄存器当中了而不是存放在栈中 补充:寄存器变量只能是局部变量,而不能是全局变量和静态变量的。在什么时候会用到呢?举个例子:for(i=0;i<10000;i++){ 循环语句;} 在上面这个...

...的单片机变量是怎么个定义法。全局变量,局部变量都放在什么存储器里...
p=50;p 表示指向0x22所在的单元格,就是将50赋值到0x22地址所指向的单元格里。再从另一个角度讲,如果你没于传参或改变实参的情况下,不建议使用这类,即使有,也不是很建议。因为单片机高手是不会用_at_这类关键字进行变量定位的。有什么疑问可以一起探讨。希望我的回答对你有帮助,谢谢。

单片机局部变量定义
反正在C51里,变量定义之前,不允许有执行语句的存在。我的C语言是在VC++ 的控制台下学习的,刚转到51时,也曾经犯过你这种错误,当时找了很久才发现。C51,包括 Keil在内的其他单片机的C语言,都不允许在定义变量之前有执行语句的存在,如果你在变量定义之前定义宏是可以的,但是不能出现执行语句。

用Keil C51写程序 没有全局变量 为什么还会有RAM占有量 并且主程序调用...
简单的解释是,函数调用的时候,是需要建立局部变量的位置存储的,这个就是一般的stack。动态分配的内存,则是放在heap里面。假设没有这个stack的分配,那么函数调用的时候,你把这些局部变量放在哪里呢?

单片机局部变量在栈里怎么访问
在单片机中,局部变量一般是存储在栈中的。栈是一种后进先出的数据结构,每个函数都有自己的栈帧。当函数被调用时,栈指针会移动到下一个空闲位置,并将函数的局部变量存储在这个位置上。在函数执行过程中,可以通过栈指针来访问局部变量。栈指针指向栈顶,而栈顶就是最后一个入栈的局部变量。通过栈...

相似回答