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

查看: 933|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版