深入解析静态局部变量与自动变量的存储分配、作用域及生存期
下面是我整理的以上三种用法的解释。另外,网友xiaocai0001的文章《静态用法总结》有更详细的解释,请参考。

静态局部变量(与 auto 相比)
1. 存储空间分配、范围和生命周期
static分配在静态存储区域中,作用范围仅限于声明该变量的函数内。在程序的整个运行过程中不会被释放,生存期贯穿于程序运行的整个过程。
auto类型分配在栈上,属于动态存储类别。它占用动态存储区域,其范围仅限于声明该变量的函数。函数调用结束后自动释放,生存期仅在声明该变量的函数内。
2. 赋初值时的处理方法
static静态局部变量在编译时被赋初值,即初值只赋一次;
auto自动变量的初值赋值是在函数调用时进行的。每次调用该函数时,都会重新赋值初始值,相当于执行了一条赋值语句。
3. 没有赋初值时如何处理
如果定义局部变量时没有赋予初始值:
static 静态局部变量在编译期间会自动分配初始值 0(对于数值变量)或空字符(对于字符变量)。
Auto自动变量,如果不指定初始值,则其值为不确定值。
静态外部全局变量
在C语言中,static也用于声明静态外部全局变量,那么这个全局变量的作用域就限制在本文件内。
外部变量(即全局变量)是在函数外部定义的,其作用域从定义该变量的地方开始,到程序文件末尾。如果外部变量没有在文件开头定义,则其有效范围仅限于定义点到文件末尾。如果定义点之前的函数要引用外部变量,则应使用关键字 extern 为引用之前的变量进行“外部变量声明”。表示该变量是已定义的外部变量。通过这个声明,外部变量从“声明”点就可以合法使用了。
而如果我们声明的全局变量不希望被其他文件访问和使用怎么办?
也就是在声明前面加上static关键字。
静态外部函数
在C语言中,我们的函数默认是全局的,这意味着你可以调用其他文件中的函数。使用时我们只需像以前一样在头文件中添加extern即可。但有时候我们写的函数不希望被其他文件访问和调用,所以我们在声明函数的时候就在函数前面加上static即可。
使用内部函数有两个好处:
1.可以防止某些内部函数被别人使用,只允许调用者使用他能使用的,这样有利于保护代码。
2.当不同的人编写不同的函数时,不必担心自己定义的函数是否与其他文件中的函数同名。