【static 修饰局部变量、全局变量、函数】
变量在内存中存放的位置
static 修饰局部变量
- 当局部变量 a 没有被static修饰时,运行结果如图所示是十个6,这是因为局部变量 a 在内存的栈区中存放,栈区的特点是进入作用域创建,出作用域销毁,而局部变量 a 的作用域在函数 test() 中,在程序第一次执行到 test() 函数里面时,局部变量 a 被创建,在程序执行完 test() 函数时,局部变量 a 被销毁,当程序第二次执行到 test() 函数里面时,局部变量 a 又被重新创建,因此每次执行 test() 函数局部变量 a 都被重新赋值,,导致每次打印的结果都是6
- 当局部变量 a 被static修饰时,变量 a 由局部变量变成了静态变量,位置由原本的栈区变成了静态区,静态区的特点是变量创建好后直到程序结束才销毁。由于变量 a 被static修饰成了静态变量,在程序被编译的时候变量 a 就被创建好了,并在程序结束时变量 a 才会被销毁,在程序结束之前一直存储在静态区。并且在执行 test() 函数时,会跳过 static int a = 5; 这条语句,不会对变量 a 进行重新赋值,可以起到一个累加的效果。
static 修饰全局变量
- static 未修饰全局变量时,如图 add.c 源文件定义变量 g_val ,,由于全局变量具有外部链接属性,因此在 test.c 源文件中可以使用变量 g_val (在同一个工程内,并且 test.c 源文件中使用 extern 声明了 g_val 这个外部符号)
- static 修饰全局变量时,改变了这个全局变量的链接属性,由外部链接属性变成了内部链接属性,导致 g_val 变量只能在 add.c 源文件中使用(即使 test.c 源文件中使用 extern 声明外部符号 g_val 也不行)
static修饰函数
static修饰函数和static修饰全局变量是一样的,函数是有外部链接属性的,但是被static修饰就变成了内部链接属性,使得这个函数只能在自己所在的源文件中使用(未被修饰时,同样需要extern 声明函数才可在其他源文件中使用)