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> 靜態函數不能被其他文件所用。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM