我們如果正常定乙個函式
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 全域性...
全域性變數,全域性靜態變數,區域性靜態變數,區域性變數
變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...