跳轉到內容

程式語言入門/靜態記憶體

來自華夏公益教科書,開放的書籍,開放的世界

靜態記憶體

[編輯 | 編輯原始碼]

當程式設計師宣告一個全域性變數,例如 `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` 的變數,但它們是不同的變數。這足以表明靜態變數的作用域不是全域性的,正如我們從它們的 رفتار 可能會想到的那樣。

華夏公益教科書