## 【我解C语言面试题系列】001 static有什么用途?
【题目】static有什么用途?
在网上流传很广的一个答案是:
1、限制变量的作用域
2、设置变量的存储域
我觉得这样答题是不妥当的,有点文不对题的感觉。
下面是我给出的答案:
static类型声明符在C语言里面主要有三个用途:
1、声明静态局部变量。
2、声明静态外部全局变量。
3、声明静态外部函数。
下面是我整理的有关上面三个用法的解释说明。另外网友xiaocai0001的《static用法小结》一文有更详细的解释,请参考。
[http://blog.csdn.net/xiaocai0001/archive/2006/04/14/662921.aspx](http://blog.csdn.net/xiaocai0001/archive/2006/04/14/662921.aspx)
**静态局部变量**(与auto对比)
**1、存储空间分配、作用域和生存期**
static分配在静态存储区,作用域仅仅限于声明该变量的函数内部。在程序
整个运行期间都不释放,生存期贯穿于程序运行的整个过程。
auto类型分配在栈上,属于动态存储类别,占动态存储区空间,作用域仅仅限于声明该变量的函数内部。函数调用结束后自动释放,生存期不过是在声明该变量的函数内部。
**2、赋初值时的处理方式**
static静态局部变量在编译时赋初值,即只赋初值一次;
auto自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
**3、未赋初值时的处理方式**
如果在定义局部变量时不赋初值的话:
static静态局部变量,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。
auto自动变量,如果不赋初值则它的值是一个不确定的值。
**静态外部全局变量**
在C语言中static还用来声明静态外部全局变量,那么这个全局变量的作用域就被限制在本文件内部。
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
而如果我们声明的全局变量不想被其他文件访问和使用又该怎么办?
那就是在声明的时候前面加上关键字static。
**静态外部函数**
在C语言中我们的函数默认都是全局的,也就是说你可以调用其他文件中的函数。在使用的时候,我们象前面一样在头文件中加上extern就可以了。但是有时候我们写的函数并不想让别的文件访问和调用,那么我们在声明函数的时候前面加上static就可以了。
使用内部函数的好处有二:
1、可以让某些内部函数不为人所能使用,而仅仅让调用者使用他能使用的东西,有利于保护代码。
2、不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。