關於靜態變數與區域性變數

2021-04-02 11:51:02 字數 614 閱讀 6087

我們如果正常定乙個函式

void fun(void)

如果我們呼叫fun函式,那麼程式會在動態資料區的棧裡頭為區域性變數申請空間,然後執行相關的**,進行操作。

當fun函式執行完畢,tmp變數就會出棧,不復存在。

但是如果我們進行如下的操作:

int* global_tmp = null;

void fun()

else

printf("global_tmp addr is : 0x%08x/n", global_tmp);

printf("global_tmp addr'addr is : 0x%08x/n", &global_tmp);

}多次呼叫fun函式,

我發現,存放global_tmp指標的位址,是在編譯的時候就確定的,在靜態/全域性資料區,如果你在fun函式中,給global_tmp賦值,那麼global_tmp會指向堆中的乙個位址,那麼他會一直儲存這個位址,直至程式結束退出。但是實際對於fun函式,每次呼叫,裡頭的變數都回在棧中分配空間,而隨著fun函式的退出,這些空間也會被釋放,那麼實際上global_tmp就指向了乙個未知的值。

所以,對於global_tmp這樣的全域性指標,所以指向的位址,應該是在堆空間中。

關於區域性變數 全域性變數 區域性靜態變數 全域性靜態變數

從作用域看 1 全域性變數 全域性作用域 全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。其他不包含全域性變數定義的原始檔需要用extern 關鍵字再次宣告這個全域性變數。2 靜態區域性變數 區域性作用域 自從第一次被初始化直到程式執行結束都一直存在,它和全域性變數的區別在於全域性變數對...

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...

全域性變數,全域性靜態變數,區域性靜態變數,區域性變數

變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...