1. 程式人生 > >關於C語言變數生存週期、作用域、記憶體分佈、預設值的基本總結

關於C語言變數生存週期、作用域、記憶體分佈、預設值的基本總結

在C語言中,參與計算的資料都是通過不同型別的常量或者變數來表示的,而使用變數時不得不注意變數的生存週期、作用域,記憶體區域和預設。在這裡簡單介紹一下記憶體區域:


程式碼段(code segment):通常是指用來存放程式執行的一塊記憶體區域。這部分割槽域的大小在程式執行前就已經確定,並且記憶體區域通常只讀;

(heap):是用於存放程序執行中被動態記憶體分配的記憶體段,大小不固定,可擴張或收縮,一般由程式設計師分配釋放;

(stack):又稱堆疊,是使用者存放程式臨時建立的區域性變數,由編譯器自動分配和釋放;

全域性(靜態)變數區:通常指用來存放程式中初始化(資料段)和未初始化的全域性變數(BSS段);

瞭解了變數的記憶體區域後,筆者將變數、函式、動態記憶體的生存週期,記憶體區域進行對比,得到了下表:


全域性變數:定義在函式外的變數,不是屬於某一個函式,而是屬於源程式檔案。全域性變數分為普通全域性變數和靜態全域性變數。

1.普通(靜態)全域性變數

生命週期:程式執行時開始建立,程式結束退出銷燬;

作用域:從定義到本檔案結束都可以使用;

預設值:0;

記憶體區域:全域性變數區;

這兩者的區別:對於普通全域性變數而言,連結屬性為外部,也就是說,它不僅可以自己用,其他檔案也可以用“extren”說明符呼叫。而靜態全域性變數是內部,只能在本檔案中呼叫。

區域性變數:函式內部宣告的變數,僅在函式內部使用。也分為普通全域性變數和靜態全域性變數。

1.普通區域性變數

生命週期:進入函式時建立,函式退出時銷燬;
作用域:本函式內部有效
預設值:隨機值;

記憶體區域:棧;

2.靜態區域性變數

生命週期:第一次執行時建立,程式結束銷燬;

作用域:從定義到程式結束;

預設值:0;

記憶體區域:全域性變數區;

這二者只能在區域性作用域可見,靜態區域性變數超過其作用域便不可被引用。

動態記憶體
生命週期:程式設計師呼叫申請動態記憶體函式建立,呼叫釋放函式或程式結束自動銷燬。
預設值:隨機值
記憶體區域:堆;
普通(靜態)函式
記憶體區域:程式碼段;
這二者差別:靜態函式的連結屬性為內部,普通函式的連結屬性為外部。