矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 5231|回复: 7

STC 的51单片机的局部变量问题,怪。

[复制链接]
     
发表于 2018-2-2 02:15:04 | 显示全部楼层 |阅读模式
有点迷糊了,看帖子说好像51单片机的子程序/子函数内定义的局部变量(假设为x)再完成这段子程序的执行退出后(没有软件赋值和清零的前提下)这个定义的局部变量x会被系统自动清零,下次再进入这段子程序运算的时候,这个该函数内的局部变量又会自动变为0
可我做了个实验发现不对啊,子程序内定义的局部变量在退出该子程序时后再重新进入该子程序,这个x还是先前退出时的值,并没有被自动清零,求老师指点哈。
我的实验是个子程序内x++,自加一的实验,如果子程序内定义的局部变量x会再退出该子程序的时候被清零,那么也就意味着这个x++永远只能从0加到1,然后退出被清零重新进入又是0+1,可实际上x可以自加上无限大,并没被自动清零。
     
发表于 2018-2-2 11:47:29 | 显示全部楼层
看来就是不保证数据的,所以不能直接使用,并不特意清除?这样会不会有安全隐患?
回复 支持 1 反对 0

使用道具 举报

     
发表于 2018-2-2 04:14:20 | 显示全部楼层
局部变量不会清零, 而且必须是自已初始化后才能使用, 否则一般的编译器会报警告或错误, 未初始化的变量初始值可能是任意值!!!
回复 支持 反对

使用道具 举报

     
发表于 2018-2-2 07:21:50 | 显示全部楼层
没什么奇怪,再次运行时仍然提供了原来的空间,那个寄存器还存在。如果先调用下别的子程序,再回过头来运行这个程序的话,那这个变量的内容就难说了。
回复 支持 反对

使用道具 举报

     
发表于 2018-2-2 14:18:40 | 显示全部楼层
不清零就不清呗,无所谓的。
回复 支持 反对

使用道具 举报

发表于 2018-2-4 10:22:29 | 显示全部楼层
这种情况和编译器有关,为了可移植性,变量一定要初始化。
回复 支持 反对

使用道具 举报

     
发表于 2018-2-4 16:04:06 | 显示全部楼层
在C语言中,程序跳出某个函数之后,这个函数所使用的局部变所占用的存储单元可能被别的函数使用了。再次调用的时候,那个变量的内容与最后一次使用这个存储单元时的状态有关,通常这是不能确定的。如果希望某个局部变量有确定的数值,要么将其设置为静态变量,要么在函数中使用这个变量之前,给它赋值。
回复 支持 反对

使用道具 举报

     
发表于 2018-2-4 22:07:24 | 显示全部楼层
并不是清零,只是不保证局部变量还存在,即是有可能被改变。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 19:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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