面試官:static 全局變量和普通全局變量的區(qū)別是什么?
Static 全局變量和普通全局變量在 C 語言中的主要區(qū)別體現(xiàn)在鏈接屬性和作用域上。
1. 鏈接屬性
在 C 語言里有鏈接屬性這個(gè)概念,分文:內(nèi)部鏈接和外部鏈接。
- 普通全局變量:具有外部鏈接(external linkage),即其他源文件可以通過extern聲明訪問該變量。
// file1.c
int globalVar = 10; // 普通全局變量
// file2.c
extern int globalVar; // 正確:可以訪問file1.c中的globalVar
- static 全局變量:具有內(nèi)部鏈接(internal linkage),只能在定義它的源文件內(nèi)訪問,其他文件無法通過 extern 引用。
// file1.c
static int staticVar = 20; // static全局變量
// file2.c
extern int staticVar; // 錯(cuò)誤:無法訪問file1.c中的staticVar
2. 作用域
- 普通全局變量:作用域是整個(gè)程序(所有源文件),前提是其他文件正確使用extern聲明。
- static 全局變量:作用域僅限于定義它的源文件,其他文件不可見。
3. 用途與優(yōu)勢(shì)
- 普通全局變量:適合在多個(gè)文件之間共享數(shù)據(jù),但需謹(jǐn)慎使用,避免命名沖突。
- static 全局變量:用于隱藏實(shí)現(xiàn)細(xì)節(jié),避免命名沖突,增強(qiáng)模塊化。例如:
// utils.c
static int counter = 0; // 僅在本文件內(nèi)使用
void increment() { counter++; } // 其他文件無法直接修改counter
4. 存儲(chǔ)與生命周期
兩者相同:存儲(chǔ)于靜態(tài)存儲(chǔ)區(qū)。靜態(tài)存儲(chǔ)區(qū)包括初始化數(shù)據(jù)段(.data)和未初始化數(shù)據(jù)段(.bss) 。普通全局變量和 static 變量(無論是全局還是局部靜態(tài))都在這里,生命周期都是整個(gè)程序運(yùn)行期間,且默認(rèn)初始化為零值。如果變量被顯式初始化了非零值,就放在.data 段;如果未初始化或初始化為零,則放在.bss 段。這樣能節(jié)省磁盤空間,因?yàn)?bss 段不存儲(chǔ)實(shí)際數(shù)據(jù),只在程序加載時(shí)分配內(nèi)存。
5. 總結(jié)
特性 | 普通全局變量 | static 全局變量 |
鏈接屬性 | 外部鏈接(可跨文件) | 內(nèi)部鏈接(僅本文件) |
作用域 | 全局 | 文件內(nèi) |
防止命名沖突 | 弱 | 強(qiáng)(隱藏變量) |
頭文件中的使用 | 需用 | 避免在頭文件中定義 |
通過合理使用static,可以提高代碼的封裝性和安全性,減少全局命名空間的污染。