static声明主要特性是两点:生命周期和作用域。
我们决定使用静态局部变量还是静态全局变量所考虑的就是该变量是否需要一直存在,需要一直保留的就要声明为static;或者该变量是否应该被限制在某个作用域,需要限定作用域的也要用static,例如限定某个全局变量只用在某个源文件内,详细说明看下文。
生命周期
如上图,静态变量是在编译完,程序还没运行就已经分配存储空间的。而自动变量(非静态的普通变量)是运行时分配的,程序还没跑就没有对应的地址空间。
生命周期与作用域
如上图,这是个坐标图,横坐标是时间,静态局部(或全局)变量的生命周期和整个程序声明周期是一样的,程序不关闭,静态变量是不会释放的(一直拥有可访问的地址空间)。静态变量用static声明。声明后就随时存在了,好处是能保留数值,不会因为函数结束了,变量就结束。方便多次调用一个数值的场合。虽然静态局部变量的作用于在函数局部,但即使函数结束了,静态变量也不会释放,这就是静态的特性。
作用域
如上图,普通的全局变量作用于很大,是所有源文件之间共享全局变量,这存在安全隐患,可能会引起错误,因此,利用static声明,可以把全局变量限制在单个源文件中,即限制了它的作用域。注意,被声明为static全局变量后,它的声明周期就和整个程序的生命周期一样长了。