你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 930|回复: 8

c语言中关键字static作用的一点体会

[复制链接]

57

主题

1159

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-12-6
发表于 2015-11-10 20:09:51 | 显示全部楼层 |阅读模式
      今天运行了一段自己写的一个程序,代码如下,
  1. /**
  2. * @brief  Test
  3. * @param  None
  4. * @retval None
  5. */
  6. uint8_t Test(void)
  7. {  
  8.   uint8_t Dummy_HALL_State=1;
  9.   
  10.   if(Dummy_HALL_State==1)
  11.   {
  12.     Delay();
  13.     Dummy_HALL_State=0;
  14.   }
  15.   else if(Dummy_HALL_State==0)
  16.   {
  17.     Delay();
  18.     Dummy_HALL_State=2;
  19.   }
  20.   else if(Dummy_HALL_State==2)
  21.   {
  22.     Delay();
  23.     Dummy_HALL_State=3;
  24.   }
  25.   else if(Dummy_HALL_State==3)
  26.   {
  27.     Delay();
  28.     Dummy_HALL_State=1;
  29.   }
  30.   return Dummy_HALL_State;
  31. }
复制代码
发现运行不正常,结果在else if中打断点,程序执行不到else if里面,后来把uint8_t Dummy_HALL_State=1;放到函数外面,程序运行正常,代码如下:

  1. /**
  2. * @brief  Test
  3. * @param  None
  4. * @retval None
  5. */
  6. uint8_t Dummy_HALL_State=1;
  7. uint8_t Test(void)
  8. {  
  9.   if(Dummy_HALL_State==1)
  10.   {
  11.     Delay();
  12.     Dummy_HALL_State=0;
  13.   }
  14.   else if(Dummy_HALL_State==0)
  15.   {
  16.     Delay();
  17.     Dummy_HALL_State=2;
  18.   }
  19.   else if(Dummy_HALL_State==2)
  20.   {
  21.     Delay();
  22.     Dummy_HALL_State=3;
  23.   }
  24.   else if(Dummy_HALL_State==3)
  25.   {
  26.     Delay();
  27.     Dummy_HALL_State=1;
  28.   }
  29.   return Dummy_HALL_State;
  30. }
复制代码
   和高手讨论发现,在函数内部定义变量时,变量为临时的,是动态变量。每次调用函数的时候局部变量每次分配的地址不一样。程序在每一次执行到函数Test();时,都会为Dummy_HALL_State在栈中分配一个临时地址,并且每次都会为执行uint8_t Dummy_HALL_State=1;这样,每次进入函数Tese();时变量Dummy_HALL_State都为1,所以在上述函数中只执行if后面的语句,不执行else if后面的语句。
     而如果将uint8_ Dummy_HALL_State=1;放入函数外部,变量就是全局变量,系统会在静态存储区,为变量分配一个固定的存储空间,这样每次执行函数Test();时,都会去那个固定的存储空间读取Dummy_HALL_State变量的值,下次再执行Test();用的Dummy_HALL_State值,是上一次保存的值,这样函数功能就正常了。
     如果非要把Dummy_HALL_State定义在函数内部,就用到static这个关键字了,将语句static uint8_t Dummy_HALL_State=1;放入子函数内部开头,变量Dummy_HALL_State就变为静态局部变量,这样编译器会为变量分配一个静态存储空间,在每次调用子函数的时候,就不会每次都为变量赋值了,而是用变量所占的静态存储空间内的值了。这样程序也就正常了。
     static的作用之一就是为局部变量分配一个静态的存储空间。



回复

使用道具 举报

77

主题

1927

回帖

5

蝴蝶豆

论坛元老

最后登录
2020-11-18
发表于 2015-11-10 21:43:40 | 显示全部楼层
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不能被extern。类似于C++类中的private函数。
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-11-10 22:35:38 | 显示全部楼层
QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...

概括简明扼要…哈哈
回复 支持 反对

使用道具 举报

3

主题

144

回帖

0

蝴蝶豆

高级会员

最后登录
2019-11-29
发表于 2015-11-10 23:38:10 | 显示全部楼层
QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...

你为啥那么强悍呢?
回复 支持 反对

使用道具 举报

10

主题

1651

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-2-15
发表于 2015-11-11 09:42:12 | 显示全部楼层
QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...

一般比较官方的是3个作用。
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2015-11-11 14:37:32 | 显示全部楼层
yanhaijian 发表于 2015-11-11 09:42
一般比较官方的是3个作用。

1. static修饰函数中的变量(栈变量):改变变量的生存期,作用域不变仍为所在函数。 只被初始化一次。

2. static修饰全局变量:限制全局变量只能被模块内访问,不可以在别的模块中用extern声明调用。

3. static修饰函数:作用与修饰全局变量类似,也是限制该函数只能在模块内访问,不能再别的模块中用extern声明调用。
回复 支持 反对

使用道具 举报

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
发表于 2015-11-11 17:29:01 | 显示全部楼层
creep 发表于 2015-11-11 14:37
1. static修饰函数中的变量(栈变量):改变变量的生存期,作用域不变仍为所在函数。 只被初始化一次。

...

学习,大神
回复 支持 反对

使用道具 举报

57

主题

1159

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-12-6
 楼主| 发表于 2015-11-11 22:05:41 | 显示全部楼层
creep 发表于 2015-11-11 14:37
1. static修饰函数中的变量(栈变量):改变变量的生存期,作用域不变仍为所在函数。 只被初始化一次。

...

经典                              
回复 支持 反对

使用道具 举报

1

主题

902

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-12-7
发表于 2015-11-13 10:21:55 | 显示全部楼层
是的呢,正如沙发所说,static修饰的变量,在执行完成以后不像局部变量被释放了。这个是不会被释放的。

而且多模块,多人合作的时候,为了避免变量重复,也会调用static 来修饰变量。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版