關於變數儲存區域問題

2021-07-04 12:28:47 字數 1039 閱讀 2604

在變數的生存作用域時,(不妨這裡以c語言為所用語言吧),乙個函式內的區域性變數在函式執行完畢後會被銷毀。

比如  (不太會在csdn上排版**,見諒):

(1)int func()  

int main()

如果main函式中沒有使用到func函式的返回值,那麼func中的a變數應該在func右}時就被銷毀,而main中使用到了,輸出temp,會列印出5,此時的temp是將a的副本拷貝到temp中了,那麼a也是銷毀了的。我的想法是:func中的return語句延長了區域性變數a的生存週期(雖然是有副本存在)。那麼疑問是:根據常識,**中的常量是儲存在常量區的,比如「hello"這種字串,那麼 數字5也是字面常量,是否也是存在於常量區域的?

在看乙個例子:

(2)int* func()

int main()

我知道,很多人會說,不要返回區域性變數的位址。那麼理由是什麼? func中的 整型變數 a 和指標變數p是儲存於棧區的,那麼數字5呢,儲存於棧區還是常量區域?如果在棧區域,那麼它也是文字常量為什麼沒有和字串乙個樣儲存於全域性常量區?或者說全域性常量區域儲存了數字常量5,而a所在的棧區域也儲存了乙個5?按照以上邏輯,正常情況下,temp值應該是乙個隨機值。這種結果也更大偏向於5儲存在棧中,但是為什麼這個數字常量不在全域性常量區? 當然了,結果不是很重要,小弟希望明白深層原因。謝謝。

(3)char* func()

int main()

這個是沒太疑問,」hello"儲存於常量區域。temp儲存p的副本,但是內容是一樣的,都是常量區域中「hello」的位址。因此輸出沒問題。

(4)char* func()

int main()

這個返回的也是亂碼,這種事實讓我不得不接受 「hello」是存放在 棧空間了(雖然我很想知道此時常量區域是否也有乙份「hello"的拷貝,但沒想出來辦法驗證),然而雖然 func中的p陣列是存放在棧上,但是「hello"是常量吖,,到底是存在兩份拷貝?還是只有p所在的棧區只有乙份,難道右值是根據左值得儲存來決定的?也不怎麼說的痛啊,思維有點混亂,希望大家解惑。謝謝。(小弟是新使用者幾乎沒有分,比較尷尬。。謝謝大家了)

C C 變數儲存區域

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 程式執行時由編譯器自動分配,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 在記憶體開闢另一塊儲存區域。一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料...

不同變數的儲存區域

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集...

關於靜態儲存區域,堆,棧

有關動態物件建立 一般來說,編譯器將記憶體分為三部分 靜態儲存區域 棧 堆。靜態儲存區主要儲存 全域性變數和靜態變數,棧儲存呼叫函式相關的變數 位址等,堆儲存動態生成的變數,在c中是指由malloc,free運算產生釋放的儲存空間,在c 中 就是指new和delete運算子作用的儲存區域。1 靜態儲...