【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】
記憶體是程式運作的基礎。所有正在運作的代碼都儲存在記憶體裡面。記憶體需要處理各種各樣的資料,包括鍵盤的資料、滑鼠的資料、usb的資料、序列槽的資料、攝像頭的資料,那麼這些資料經過程式的處理之後,就要進行輸出到序列槽、螢幕、usb等。
記憶體隻有一個,但是程式裡面的空間有很多種。但是記憶體中的資料類型隻有幾種,比如說全局中的資料、堆中的資料、臨時堆棧中的資料。那麼他們有什麼差別呢?我們可以通過代碼發現一些問題。
(1)全局資料
大家可以在這裡看到,value和number的資料其實都屬于全局資料,這裡的變量是不随着函數的調用發生變化的。
(2)堆資料
這裡的point配置設定的資料就是堆資料,如果沒有free操作,那麼它的存在也是全局的。隻要記憶體不主動釋放,那麼這個記憶體就會以一直存在。
(3)臨時資料
這裡的資料都是堆棧内部的資料,一旦process調用結束傳回之前,那麼name位址指向的記憶體空間已經被其他函數使用。此時這段記憶體空間對我們來說已經沒有什麼意義了。是以,不管在函數裡面用了多少空間,如果你想在函數傳回之前繼續使用裡面的資料,務必在函數傳回前拷貝完畢。
這篇部落格的内容比較簡單,主要講述了記憶體的一些内容。其實關于記憶體的東西還很多。這裡說明一下隻是讓大家有一個了解:
1) 全局資料是我們喜歡使用的類型,用起來比較友善
2)堆資料是系統給我們安排的空間
3)堆棧空間隻能存在于當時的函數之中,函數傳回即失去意義
雖然我們上面這麼說,但是這三個概念有的時候也是可以互相遷移的,比如說:
1) 有的時候,我們為了測試的需要,首先建構一個全局記憶體池,以後測試的記憶體都是通過自定義的malloc在記憶體池中配置設定的,是以這個時候,堆配置設定和全局聯系在了一起。
全局記憶體空間 < =========> 記憶體池 < =========> 本地空間配置設定
2) 如果我們使用的函數空間比較小,那麼所有的操作就可以在一個函數内部完成了,那麼這時候全局空間和臨時堆棧是不是一緻的呢
全局空間 < =============> 本地堆棧
上面的說法有些繞,但是我們的目的隻是想讓大家時刻明白:
a)必須時刻明白我們的資料在哪塊空間裡面
b)記憶體會不會越界
c)記憶體會不會洩露
d)記憶體通路的資料是否依然有效
【預告: 下面的部落格開始介紹線性空間的内容】