1. 程式人生 > >c語言區域性變數應該注意什麼?

c語言區域性變數應該注意什麼?

去年我們部門在17屆大學生在轉正述職答辯時,有位同學(同事)被領導提出一個問題:“c語言區域性變數應該注意什麼?”
當時我的第一反應就是,static靜態變數,命名與全域性變數避免衝突。我記得那位同學說的是注意記憶體,今天突然想到這個問題,我就把知道的都寫出來了(歡迎大家在下面進行修正和補充)。
區域性變數我的理解就是函式體內就是區域性變數,函式體外就是全域性變數。
一、首先是注意命名規則
命名規則我第一個想到的就是《華為程式設計規範》,我剛入職的時候,公司的程式碼測評人員還特地交代過,很多公司都是按照這個來的。
規範示例:

int liv_Width

其變數名解釋如下:
l:區域性變數(Local)(其它:g 全域性變數(Global))
i : 資料型別(Interger)
v 變數(Variable)(其它:c 常量(Const)…)
Width 變數含義
這麼做的方法好處之一就是避免了與全域性變數混淆,不過我覺得這個不適合模組化思想,我看了一些linux原始碼和uboot原始碼,區域性變數大部分還是命名為"變數含義”+“_”+“模組名(或函式名)”

二、static和記憶體
static區域性變數是要和記憶體一起說的:
普通的區域性變數在棧空間上分配,這個區域性變數所在的函式被多次呼叫時,每次呼叫這個區域性變數在棧上的位置都不一定相同。區域性變數也可以在堆上動態分配(malloc),但是記得使用完這個堆空間後要釋放之。
在棧空間上分配時是要注意記憶體的,不能分配記憶體過大。如果棧內空間小於所申請的空間大小,那麼這時系統將揭示棧溢位,並給出相應的異常 資訊 。但是堆不一樣,堆可分配空間是很大的。
static區域性變數中文名叫靜態區域性變數。普通區域性變數是在動態儲存區的(堆疊區),但是靜態區域性變數是在靜態儲存區的(和全域性變數在一個地方,可以當全域性變數使用)
它與普通的區域性變數比起來有如下幾個區別:
1)位置:靜態區域性變數被編譯器放在全域性儲存區.data,所以它雖然是區域性的,但是在程式的整個生命週期中存在(定義時出生,隨著程式結束而結束)。
2)訪問許可權:靜態區域性變數只能被其作用域內的變數或函式訪問。也就是說雖然它會在程式的整個生命週期中存在,由於它是static的,它不能被其他的函式和原始檔訪問。
3)值:靜態區域性變數如果沒有被使用者初始化,則會被編譯器自動賦值為0,以後每次呼叫靜態區域性變數的時候都用上次呼叫後的值。