(2)设置变量的存储域
一个进程在内存中的布局如图所示:
.text段保存进程所执行的程序二进制文件,.data段保存进程所有的已初始化的全局变量,.bss段保存进程未初始化的全局变量(其他段中还有很多乱七八糟的段,暂且不表)。在进程的整个生命周期中,.data段和.bss段内的数据时跟整个进程同生共死的,也就是在进程结束之后这些数据才会寿终就寝。
static 全局变量与普通的全局变量有什么区别?
两者都是静态存储方式,区别在于非静态全局变量的作用域是整个源程序。当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,而静态全局变量的作用距局限于一个源文件内,只能为源文件内的函数使用。把普通全局变量改为静态全局变量时改变了它的作用域,限制了它的使用范围。static 局部变量与普通的局部变量有什么区别?
1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内,原因见3)),所以它虽然是局部的,但是在程序的整个生命周期中存在。
2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。
3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
static函数
static函数与普通函数的作用域不同,他仅仅存在于本文件中,类似于面向对象编程中的private函数的功能。
当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些“其他的函数。
static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。