程式語言入門/靜態記憶體
外觀
< 程式語言入門
當程式設計師宣告一個全域性變數,例如 `global_var`、`global_const` 或 `global_const2` 時,它們可以進入資料或bss部分,具體取決於它們是否被初始化。如果它們被初始化了,它們會進入資料部分。如果沒有,它們會進入bss部分。靜態變數的工作方式與全域性變數相同:它們會進入資料或bss部分,具體取決於它們的初始化情況。
請注意,這些段的大小在編譯時是已知的。資料和bss之間的唯一區別是初始化。還需要指出的是,由編譯器初始化為零的全域性變數和靜態變數會進入bss。因此,`static_var_u` 會進入bss,而 `static_var` 會進入資料。
靜態變數的行為幾乎與全域性變數相同:雖然區域性變數在每次函式退出時會丟失其值,但靜態變數會跨函式呼叫保留其值。以下程式展示了這種行為。
#include <stdio.h>
int counter1() {
static store = 0;
store++;
printf("Counter 1 = %d\n", store);
return store;
}
int counter2() {
static store = 0;
store++;
printf("Counter 2 = %d\n", store);
return store;
}
int main() {
int i;
char* s = "Counter = ";
for (i = 0; i < 5; i++) {
if (i % 2) {
counter1();
} else {
counter2();
}
}
}
執行上面的程式,我們看到,儘管有兩個名為 `store` 的變數,但它們是不同的變數。這足以表明靜態變數的作用域不是全域性的,正如我們從它們的 رفتار 可能會想到的那樣。