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的作用之一就是为局部变量分配一个静态的存储空间。
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不能被extern。类似于C++类中的private函数。 QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...
概括简明扼要…哈哈 QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...
你为啥那么强悍呢? QianFan 发表于 2015-11-10 21:43
1.用于修饰一个变量。当退出变量作用域之后变量不被清除。
2.用于修饰一个函数。这个函数在其他的文件中不 ...
一般比较官方的是3个作用。 yanhaijian 发表于 2015-11-11 09:42
一般比较官方的是3个作用。
1. static修饰函数中的变量(栈变量):改变变量的生存期,作用域不变仍为所在函数。 只被初始化一次。
2. static修饰全局变量:限制全局变量只能被模块内访问,不可以在别的模块中用extern声明调用。
3. static修饰函数:作用与修饰全局变量类似,也是限制该函数只能在模块内访问,不能再别的模块中用extern声明调用。 creep 发表于 2015-11-11 14:37
1. static修饰函数中的变量(栈变量):改变变量的生存期,作用域不变仍为所在函数。 只被初始化一次。
...
学习,大神:lol creep 发表于 2015-11-11 14:37
1. static修饰函数中的变量(栈变量):改变变量的生存期,作用域不变仍为所在函数。 只被初始化一次。
...
经典 是的呢,正如沙发所说,static修饰的变量,在执行完成以后不像局部变量被释放了。这个是不会被释放的。
而且多模块,多人合作的时候,为了避免变量重复,也会调用static 来修饰变量。
页:
[1]