1.全局變量
定義在函數(shù)內(nèi)部的變量為本地變量;定義在函數(shù)外面的變量是全局變量。
本地變量的生存期和作用域一致,都在函數(shù)內(nèi)部;全局變量具有全局的生存期和作用域。它們與任何函數(shù)都無關(guān),在任何函數(shù)內(nèi)部都可以使用它們。
全局變量的初始化
沒有做初始化的全局變量編譯器會(huì)自動(dòng)給它補(bǔ)上 0 值。指針會(huì)得到 NULL 值。本地變量一定要初始化??!!
只能用編譯時(shí)刻已知的值來初始化全局變量。全局變量的值不應(yīng)該和另一個(gè)全局變量聯(lián)系在一塊。
它們的初始化發(fā)生在 main 函數(shù)之前。
被隱藏的全局變量
如果函數(shù)內(nèi)部存在與全局變量同名的變量,則全局變量被隱藏。
在更小的地方,可以重新定義更大地方曾經(jīng)出現(xiàn)過的變量,把它隱藏。
2.靜態(tài)本地變量
在本地變量定義時(shí)加上 static 修飾符就成為靜態(tài)本地變量。當(dāng)函數(shù)離開的時(shí)候,靜態(tài)本地變量會(huì)繼續(xù)存在并保持其值。
靜態(tài)本地變量的初始化只會(huì)在第一次進(jìn)入這個(gè)函數(shù)時(shí)做。以后進(jìn)入函數(shù)時(shí)會(huì)保持上次離開時(shí)的值。不會(huì)被重新初始化。
靜態(tài)本地變量實(shí)際上是特殊的全局變量。它們位于相同的內(nèi)存區(qū)域(與全局變量緊挨)。
靜態(tài)本地變量具有全局的生存期,函數(shù)內(nèi)部的局部作用域。static 在這里的意思是局部作用域(僅本地可訪問)。
3. TIPS
返回指針的函數(shù)
返回本地變量的地址是危險(xiǎn)的,一旦離開函數(shù),本地變量不存在(不受控),地址分配給別人使用。
返回全局變量或靜態(tài)本地變量的地址是安全的(地址與函數(shù)無關(guān))。
返回在函數(shù)內(nèi) malloc 的內(nèi)存是安全的,但是容易造成問題。
最好的做法是返回傳入的指針。
不要使用全局變量在函數(shù)間傳遞參數(shù)和結(jié)果。
盡量避免使用全局變量(使用全局變量和靜態(tài)本地變量的函數(shù)是線程不安全的)。