c语言static关键字的理解

static程序员

1、概述

在c语言中static恰当的使用能让程序更加完美,细节上的严谨,代码会更好,也更利于程序的维护与扩展。函数

而static使用灵活,且又有两种彻底无关的用法,因此整理总结一下。工具

2、static的两种用法:

一、static修饰局部变量,成为一个局部静态变量。spa

二、static修饰全局变量与函数,成为静态全局变量与静态函数。blog

 

3、相关涉及概念

  可能会疑惑,修饰全局变量与修饰函数怎么会是一个用法?生命周期

  static涉及的东西也比较多,如下有几个概念须要明白。内存

 

 一、什么是存储类

  简单的说也就是存储类型,c中变量是在哪里存放的?内存是怎么管理的?作用域

  因此内存的管理:get

①栈:局部变量,函数调用传参的过程编译器

②堆:动态存储区,须要程序员去申请释放

③数据段(data段):显式初始化非零的全局变量(static修饰显式初始化非0的局部变量)

④bss段:显式初始化为0与未初始化的全局变量(static修饰显式初始化为0与未初始化的局部变量)

⑤text段:代码(函数)、只读数据

 

二、什么是生命周期

描述变量何时诞生,何时消亡,从诞生到消亡就是这个变量的生命周期。

①局部变量(栈),生命周期便是进入函数,从变量建立到函数返回时变量死亡。

②全局变量(data/bss),生命周期是程序执行到程序结束

③堆变量,生命周期是从咱们malloc到free

 

三、什么是做用域

描述变量的做用的代码范围。c的做用域规则是代码块做用域,便是一对花括号{}。

通常的从变量定义到{}结束,便是这个变量的做用域

全局变量与函数通常是文件做用域,即做用域是整个.c

 

四、什么是连接属性

编译器将不少源文件编译成不少.o文件后,每一个.o文件里有符号、代码段、data/bss等等的分段,连接器须要经过符号将这些内存连接起来。而这些符号就是连接属性。

c中有三种连接属性:外连接、内连接、无连接属性

外连接:外部连接,能够在整个程序(跨文件)连接。

    普通的函数与全局变量。

内连接:内部链接,只能在当前.c文件进行连接。

    static修饰的全局变量与函数

无连接:没有连接。

      普通局部变量 

 

4、具体分析static的两种用法

一、static修饰局部变量(静态局部变量)与普通局部变量相比

①静态局部变量做用域与链接属性与普通局部变量同样

②存储类:静态局部变量分配在data/bss段,普通局部变量在栈上。

③生命周期:由于存储类的不一样,静态局部变量的生命周期获得延长了,直到程序结束。

因此当局部静态变量离开做用域后,并无销毁,而是仍然驻留在内存当中,只不过咱们不能再对它进行访问,直到该函数再次被调用,而且值不变。

二、static修饰全局变量\函数 与 普通全局变量\普通函数相比

存储类、生命周期、做用域都同样

差异在于static修饰全局变量\函数链接属性是内链接,普通全局变量\普通函数是外连接

就是说static修饰全局变量\函数不能跨文件访问调用

 

5、补充:为何须要这样?

缘由是命名的冲突、一个大工程不是经常不是一我的完成的,不免会遇到全局变量、函数命名同样。为了减小这类冲突static是颇有用的工具。可是很惋惜并不能彻底解决,因此咱们应该有效的去避免减小此类状况的发生。

若是函数仅仅被同一个源文件调用时,咱们就应该声明该函数为static。

  ......

 


 

 做者:Devil-wei

出处:https://www.cnblogs.com/Devil-wei/

相关文章
相关标签/搜索