💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 【我解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、不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。