-
目录
2.static修饰全局变量与函数,成为静态全局变量与静态函数
普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。
-
普通局部变量存储于进程栈空间,使用完毕会立即释放。
-
静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
-
static 关键字两种基本用法
-
static修饰局部变量,成为一个局部静态变量
-
static修饰局部变量(静态局部变量)与普通局部变量相比:
-
静态局部变量作用域与连接属性与普通局部变量一样。
-
存储类:静态局部变量分配在data/bss段,普通局部变量在栈上。
-
生命周期:因为存储类的不同,静态局部变量的生命周期得到延长了,直到程序结束,而普通的局部变量在函数体执行结束之后就直接回收销毁了,每次执行都会重新分配内存。
-
所以当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。
-
示例代码
#include <stdio.h>
void test()
{
int num = 0; //普通局部变量
static int s_num = 0; //静态局部变量
s_num ++;
num ++;
printf("num = %d ", num);
printf("s_num = %d\n", s_num);
}
int main(int argc, char *argv[])
{
int i = 0;
for (i = 0; i < 10; ++i)
{
test();
}
return 0;
}
-
程序运行结果:
2.static修饰全局变量与函数,成为静态全局变量与静态函数
- static修饰全局变量和函数 与 普通全局变量和普通函数相比
- 存储类、生命周期、作用域都一样。
- 差别在于static修饰全局变量\函数连接属性是内连接(只能被本c文件使用),普通全局变量\普通函数是外链接(可以被出本c文件之外的其他c文件使用)。
- 就是说static修饰全局变量\函数不能跨文件访问调用。
3.涉及到相关概念
1、什么是存储类
- 简单的说也就是存储类型,c中变量是在哪里存放的?内存是怎么管理的?
- 所以内存的管理:
- 栈:局部变量,函数调用传参的过程。
- 堆:动态存储区,需要程序员去申请释放(malloc() new())。
- 数据段(data段):显式初始化非零的全局变量(static修饰显式初始化非0的局部变量)。
- bss段:显式初始化为0与未初始化的全局变量(static修饰显式初始化为0与未初始化的局部变量)。
- text段:代码(函数)、只读数据。
2、什么是生命周期
- 描述变量什么时候诞生,什么时候消亡,从诞生到消亡就是这个变量的生命周期。
- 局部变量(栈),生命周期即是进入函数,从变量创建到函数返回时变量死亡。
- 全局变量(data/bss),生命周期是程序执行到程序结束
- 堆变量,生命周期是从我们malloc到free
3、什么是作用域
- 描述变量的作用的代码范围。c的作用域规则是代码块作用域,即是一对花括号{}。
- 一般的从变量定义到{}结束,即是这个变量的作用域
- 全局变量与函数一般是文件作用域,即作用域是整个.c
4、什么是链接属性
- 编译器将很多源文件编译成很多.o文件后,每个.o文件里有符号、代码段、data/bss等等的分段,链接器需要通过符号将这些内存链接起来。而这些符号就是链接属性。
- c中有三种链接属性:外链接、内链接、无链接属性。
- 外链接:外部链接,可以在整个程序(跨文件)链接。 普通的函数与全局变量。
- 内链接:内部连接,只能在当前.c文件进行链接。 static修饰的全局变量与函数。
- 无链接:没有链接。 普通局部变量 。