關於C語言變數生存週期、作用域、記憶體分佈、預設值的基本總結
在C語言中,參與計算的資料都是通過不同型別的常量或者變數來表示的,而使用變數時不得不注意變數的生存週期、作用域,記憶體區域和預設值。在這裡簡單介紹一下記憶體區域:
程式碼段(code segment):通常是指用來存放程式執行的一塊記憶體區域。這部分割槽域的大小在程式執行前就已經確定,並且記憶體區域通常只讀;
堆(heap):是用於存放程序執行中被動態記憶體分配的記憶體段,大小不固定,可擴張或收縮,一般由程式設計師分配釋放;
棧(stack):又稱堆疊,是使用者存放程式臨時建立的區域性變數,由編譯器自動分配和釋放;
全域性(靜態)變數區:通常指用來存放程式中初始化(資料段)和未初始化的全域性變數(BSS段);
瞭解了變數的記憶體區域後,筆者將變數、函式、動態記憶體的生存週期,記憶體區域進行對比,得到了下表:
全域性變數:定義在函式外的變數,不是屬於某一個函式,而是屬於源程式檔案。全域性變數分為普通全域性變數和靜態全域性變數。
1.普通(靜態)全域性變數
生命週期:程式執行時開始建立,程式結束退出銷燬;
作用域:從定義到本檔案結束都可以使用;
預設值:0;
記憶體區域:全域性變數區;
這兩者的區別:對於普通全域性變數而言,連結屬性為外部,也就是說,它不僅可以自己用,其他檔案也可以用“extren”說明符呼叫。而靜態全域性變數是內部,只能在本檔案中呼叫。
區域性變數:函式內部宣告的變數,僅在函式內部使用。也分為普通全域性變數和靜態全域性變數。
1.普通區域性變數
生命週期:進入函式時建立,函式退出時銷燬;作用域:本函式內部有效
預設值:隨機值;
記憶體區域:棧;
2.靜態區域性變數
生命週期:第一次執行時建立,程式結束銷燬;
作用域:從定義到程式結束;
預設值:0;
記憶體區域:全域性變數區;
這二者只能在區域性作用域可見,靜態區域性變數超過其作用域便不可被引用。
動態記憶體
生命週期:程式設計師呼叫申請動態記憶體函式建立,呼叫釋放函式或程式結束自動銷燬。
預設值:隨機值
記憶體區域:堆;
普通(靜態)函式
記憶體區域:程式碼段;
這二者差別:靜態函式的連結屬性為內部,普通函式的連結屬性為外部。