static是用来说明静态变量的,放在在静态储存区(既不是堆也不是栈)。

一、如果是在函数外面定义的,那么其效果和全局变量类似,即static说明的变量可以在当前c程序文件使用。(如果是普通的全局变量,那么他在多个源文件中都有效,另:全局变量存在静态存储区)。同理,static声明的函数也只在本源文件有效,称为内部函数。

二、如果是在函数内部定义的,那么这个变量只初始化一次(即只赋值一次),后续再调用这个函数,这个static的变量不会再初始化,于是这个变量就会一直保存,我们再次调用时,仍是保存上一次的调用结果(即不会被程序自动清除)。

c语言中的static有三个主要作用:

1、隐藏性。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

2、static可以保持变量内容的持久,当static定义变量在函数内部时,改变量值的生命周期和全局变量相同。

3、static可以令其定义变量内存区所有字节默认初始化为0,这一特点可以省去程序员许多麻烦,减少工作量。

内存分配:

BSS

通常是指内存中存放程序中未初始化的全局变量与静态变量的区域,BSS属于静态内存分配。

数据段

通常是指内存中存放程序中已经初始化的全局变量与静态变量的区域,数据段属于静态内存分配。

代码段

代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

堆区

动态分配的内存区,大小不固定,需要程序员手动分配malloc,手动释放free。

是用户存放程序临时创建的局部变量,{}内定义的变量,由OS自动分配释放。