全局變量初始化相關的一個錯誤

全局變量初始化相關的一個錯誤

標籤(空格分隔):Coding-Nissan


  • 全局變量初始化全局變量
    在C++中對於以下語句:
// 全局域
int i = 3;
int j = i;

  因爲是全局變量,編譯時會將i放入.data段,並設置其值爲3.而對於j,編譯器遇到這種非常量的全局變量初始化語句,只知道j=i,由於i是變量,不是常量,編譯器無法在編譯時直接得到它的值,即編譯器不能夠直接用3來初始化j。編譯器無法在編譯時求得一個非常量的值,它只能在運行時通過讀取變量地址來間接得到變量的值,而全局變量在編譯時就必須確定其值,故C有靜態存儲區數據必須用常量初始化的規定。
  由於j是全局變量,存儲在靜態存儲區,因此也需要在編譯時確定其值。而i是變量,不是常量,i的值無法在編譯時確定,這就造成j的值也無法在編譯時確定,所以C對此就會報錯。而C++採取了另外一種做法,在編譯時簡單的把j作爲未初始化的全局變量放入.bss區,其默認值爲0,然後添加一條語句在運行時通過i的地址進而讀取i的值,再賦給j。上述過程在 main函數開始之前執行。因此j 的初始化實際上實在運行時完成的。
【補充】
.data段:指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬於靜態內存分配。
.bss段:通常是指用來存放程序中未初始化的全局變量的一塊內存區域。BSS段屬於靜態內存分配。
上述完整的過程可以概括爲:

取i的地址,把3放到i的地址中,取i的地址,讀取這個地址中的內容,取j的地址,把這個內容 寫入j 的地址。

  • 全局變量初始化局部變量
int i = 3

int main()
{
    int j = i;
    ...
}

  在編譯時不需要確定局部變量j的值,而是在運行時讀取i的值來賦給j。編譯連接後的可執行文件中不會存放j的值,只有相應的賦值語句的代碼。與此相對的,由於i是全局變量,存儲在靜態存儲區,因此在編譯時其值就需要確定其值,在目標文件中會分配空間來存放i的值,運行時不會有賦值語句來給i賦值,沒有對應的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章