你好我好大家好! 发表于 2015-11-10 20:09:51

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

      今天运行了一段自己写的一个程序,代码如下,/**
* @briefTest
* @paramNone
* @retval None
*/
uint8_t Test(void)
{
uint8_t Dummy_HALL_State=1;

if(Dummy_HALL_State==1)
{
    Delay();
    Dummy_HALL_State=0;
}
else if(Dummy_HALL_State==0)
{
    Delay();
    Dummy_HALL_State=2;
}
else if(Dummy_HALL_State==2)
{
    Delay();
    Dummy_HALL_State=3;
}
else if(Dummy_HALL_State==3)
{
    Delay();
    Dummy_HALL_State=1;
}
return Dummy_HALL_State;
}发现运行不正常,结果在else if中打断点,程序执行不到else if里面,后来把uint8_t Dummy_HALL_State=1;放到函数外面,程序运行正常,代码如下:

/**
* @briefTest
* @paramNone
* @retval None
*/
uint8_t Dummy_HALL_State=1;
uint8_t Test(void)
{
if(Dummy_HALL_State==1)
{
    Delay();
    Dummy_HALL_State=0;
}
else if(Dummy_HALL_State==0)
{
    Delay();
    Dummy_HALL_State=2;
}
else if(Dummy_HALL_State==2)
{
    Delay();
    Dummy_HALL_State=3;
}
else if(Dummy_HALL_State==3)
{
    Delay();
    Dummy_HALL_State=1;
}
return Dummy_HALL_State;
}    和高手讨论发现,在函数内部定义变量时,变量为临时的,是动态变量。每次调用函数的时候局部变量每次分配的地址不一样。程序在每一次执行到函数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的作用之一就是为局部变量分配一个静态的存储空间。



QianFan 发表于 2015-11-10 21:43:40

1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不能被extern。类似于C++类中的private函数。

风子 发表于 2015-11-10 22:35:38

QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...

概括简明扼要…哈哈

alles_ok>>0_0<< 发表于 2015-11-10 23:38:10

QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...

你为啥那么强悍呢?

yanhaijian 发表于 2015-11-11 09:42:12

QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...

一般比较官方的是3个作用。

creep 发表于 2015-11-11 14:37:32

yanhaijian 发表于 2015-11-11 09:42
一般比较官方的是3个作用。

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

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

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

netlhx 发表于 2015-11-11 17:29:01

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

...

学习,大神:lol

你好我好大家好! 发表于 2015-11-11 22:05:41

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

...

经典                              

huaiqiao 发表于 2015-11-13 10:21:55

是的呢,正如沙发所说,static修饰的变量,在执行完成以后不像局部变量被释放了。这个是不会被释放的。

而且多模块,多人合作的时候,为了避免变量重复,也会调用static 来修饰变量。
页: [1]
查看完整版本: c语言中关键字static作用的一点体会