C语言 全局变量,全局静态变量,局部静态变量的理解
静态变量
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直
占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束。静态变量虽在程序的整个执行过程中始终存在,
但是在它作用域之外不能使用。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值,说其静态是因为它不会随着函数的调用和退出而发生变化。
即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
全局变量
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。
所有的全局变量都是静态变量
如果全局变量不在文件的开头定义,有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字 extern 对该变量作"外部变量声明",表示该变量是一个已经定义的外部变量。有了此声明,就可以从"声明"处起,合法地使用该外部变量。
全局静态变量
全局变量(外部变量)的声明之前再冠以static 就构成了静态的全局变量。
局部静态变量
在函数中定义的static局部变量,即只能在定义该变量的函数内使用该变量(无法跨函数使用,即使这些函数在同一个文件中)。不论其使用的函数是否被调用,都一直存在。保留上次调用后留下的函数值。
当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。局部静态变量占用内存时间较长,并且可读性差,因此,除非必要应尽量避免使用局部静态变量。
全局变量与全局静态变量的差异
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式,这两者在存储方式上并无不同。
区别在于
a、全局变量的作用域是整个源程序 ,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。
b、全局静态变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件(即声明(extern)了该变量的.c文件,或包含该变量声明头文件的.c文件)中也不能使用它。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
动态库中的全局变量
在单进程动态库中多次调用同一个函数时,全局变量的值会被保留下来供下一次调用使用。如果需要在不同的函数之间共享数据,可以使用全局变量来实现。
但是需要注意,多线程环境下访问全局变量可能会导致竞争条件和数据不一致问题。