問題**:
#include int *foo()intmain()
最後會列印:58
理論上,a是區域性變數,所以a的位址在foo()函式返回時就釋放了,那為什麼還能讀取到5這個值呢。
這個行為是不好的,雖然還可以讀取5,但是並不代表5這個值是安全的,我們不知道會有什麼樣的行為會改變它,因此它可以是5也可以是乙個隨機數,並且在編譯的時候,編譯器也會給出警告。
堆是程式設計師手動申請的,不受系統監管,堆是程序擁有的,執行緒之間共享。
最後,在申請記憶體時,要養成初始化的習慣。
**區 – 程式的**(以函式的形式)存入**區,函式指標就是函式在**取得位址,**區 是 唯讀區域.
唯讀常量區 – 很多的書上都把唯讀常量區歸入**區,存放字串的字面值(「abc」)和const修飾的全域性變數。
全域性區 – 存放全域性變數和static的區域性變數,讀寫許可權。
bss段 – 存放為初始化的全域性變數(沒有寫=的),讀寫許可權。全域性區和bss段區別在於:雖然兩者都是在main執行前建立,但bss段不會在 main()執行之前自動清0,而全域性區會。
棧區(stack) - 也叫堆疊區 ,存放區域性變數(沒有static),函式的形參也是在棧區。
堆區 (heap)- 也叫自由區,是程式設計師完全管理的區域,系統不會管理這個區域。
JS 關於用區域性變數
1.全域性變數不好用 互相覆蓋來覆蓋去 2.所以用區域性變數 要用區域性變數必須有乙個函式 3.立即執行函式 所以宣告乙個函式,立即呼叫它。我們只是為了用區域性變數 function call 4.提示語法錯誤,怎麼破 1.最外層加括號 function call 2.只把匿名函式括起來 funct...
關於靜態變數與區域性變數
我們如果正常定乙個函式 void fun void 如果我們呼叫fun函式,那麼程式會在動態資料區的棧裡頭為區域性變數申請空間,然後執行相關的 進行操作。當fun函式執行完畢,tmp變數就會出棧,不復存在。但是如果我們進行如下的操作 int global tmp null void fun else...
關於全域性變數和區域性變數
1.區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...