C--静态变量和静态函数static

1. 静态局部变量:

#include <stdio.h>

//在本地变量定义时加上static修饰符就成为静态本地变量 
//当函数离开的时候,静态本地变量会继续存在并保持其值
//静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值
//静态本地变量的实质是特殊的全局变量 
//静态本地变量具有全局的生存期,函数内的局部作用域

void f(void) {
    static int a = 1;
//静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);    
    //它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,也就是不能在函数体外面使用它
    a += 5;
    printf("%d
", 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> 静态函数不能被其他文件所用。

 

 

 

原文地址:https://www.cnblogs.com/liming19680104/p/13375619.html