C--静态变量和静态函数static
1. 静态局部变量:
#include <stdio.h> //在本地变量定义时加上static修饰符就成为静态本地变量 //当函数离开的时候,静态本地变量会继续存在并保持其值 //静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值 //静态本地变量的实质是特殊的全局变量 //静态本地变量具有全局的生存期,函数内的局部作用域 void f(void) { static int a = 1; //静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化); //它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,也就是不能在函数体外面使用它 a += 5; printf("%d\n", a); } int main() { f(); f(); f(); return(0); }
c/c++的内存分布,以及static所在的区间:
对于一个完整的程序,在内存中的分布情况如下图:
1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间
2.堆区:程序员分配并释放的区域,像malloc(c),new(c++)
3.全局数据区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放
4.代码区
2.静态全局变量:
全局变量、静态全局变量这两者在存储方式上并无不同,区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它
3.静态函数:
准确的说,静态函数跟静态全局变量的作用类似
static函数与普通函数的区别是:用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用
定义静态函数有以下好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突。 <2> 静态函数不能被其他文件所用。