2.前者分配在內存的全局數據區,後者分配在內存的堆棧區;
3.不同的生命周期:全局變量隨著主程序的創建而創建和銷毀,隨著主程序的銷毀而銷毀;局部變量存在於局部函數內部,甚至存在於局部循環體內部,但exit不存在;
4.使用方式不同:聲明後,全局變量程序的所有部分都可以使用,而局部變量只能在局部使用。
操作系統和編譯器通過內存分配位置知道的全局變量被分配在全局數據段中,並在程序運行時加載。;
編譯器通過語法和詞法的分析判斷它是全局變量還是局部變量。如果是全局變量,編譯器在將源代碼翻譯成二進制代碼時會為全局變量分配壹個虛擬地址(windows下0x00400000以上的地址,即所謂的全局區域),因此程序在對全局變量進行操作時會對硬編碼的地址進行操作。?
對於局部變量,在編譯時並不分配空間,而是通過與ebp或esp的偏移量來表示局部變量的地址,因此當調用局部變量所在的函數時,局部變量內存才真正被分配。從匯編的角度來看:函數執行時,局部變量在棧中分配,函數調用後釋放局部變量對應的內存,可以直接在寄存器中分配局部變量。
操作系統可以通過變量的分配地址來判斷它是局部變量還是全局變量。