voidprocess()
引自:記憶體是程式執行的基礎。所有正在執行的**都儲存在記憶體裡面。記憶體需要處理各種各樣的資料,包括鍵盤的資料、滑鼠的資料、usb的資料、串列埠的資料、攝像頭的資料,那麼這些資料經過程式的處理之後,就要進行輸出到串列埠、螢幕、usb等。
記憶體只有乙個,但是程式裡面的空間有很多種。但是記憶體中的資料型別只有幾種,比如說全域性中的資料、堆中的資料、臨時堆疊中的資料。那麼他們有什麼區別呢?我們可以通過**發現一些問題。
(1)全域性資料
staticint value = 100
;void
process()
大家可以在這裡看到,value和number的資料其實都屬於全域性資料,這裡的變數是不隨著函式的呼叫發生變化的。
(2)堆資料
voidprocess()
這裡的point分配的資料就是堆資料,如果沒有free操作,那麼它的存在也是全域性的。只要記憶體不主動釋放,那麼這個記憶體就會以一直存在。
(3)臨時資料
voidprocess()
;
return
;}
這裡的資料都是堆疊內部的資料,一旦process呼叫結束返回之前,那麼name位址指向的記憶體空間已經被其他函式使用。此時這段記憶體空間對我們來說已經沒有什麼意義了。所以,不管在函式裡面用了多少空間,如果你想在函式返回之前繼續使用裡面的資料,務必在函式返回前拷貝完畢。
1) 全域性資料是我們喜歡使用的型別,用起來比較方便
2)堆資料是系統給我們安排的空間
3)堆疊空間只能存在於當時的函式之中,函式返回即失去意義
雖然我們上面這麼說,但是這三個概念有的時候也是可以相互遷移的,比如說:
1) 有的時候,我們為了測試的需要,首先構建乙個全域性記憶體池,以後測試的記憶體都是通過自定義的malloc在記憶體池中分配的,所以這個時候,堆分配和全域性聯絡在了一起。
全域性記憶體空間 < *****====> 記憶體池 < *****====> 本地空間分配
2) 如果我們使用的函式空間比較小,那麼所有的操作就可以在乙個函式內部完成了,那麼這時候全域性空間和臨時堆疊是不是一致的呢
全域性空間 < **********===> 本地堆疊
a)必須時刻明白我們的資料在哪塊空間裡面
b)記憶體會不會越界
c)記憶體會不會洩露
d)記憶體訪問的資料是否依然有效
【預告: 下面的部落格開始介紹線性空間的內容】
資料結構與演算法學習筆記(四)
單鏈表的整表建立宣告一結點p和計數器變數i 初始化一空鍊錶l 讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表 迴圈實現後繼結點的賦值和插入 頭插法 從乙個空表開始,生成新節點,讀取資料存放到新結點的資料域中,然後將新結點插入到當前鍊錶的表頭上,直到結束位置。簡單來說就是把新加進的元素放在...
資料結構和演算法學習 棧
棧是一種重要的線性結構,可以說是線性表的一種具體形式 官方定義 棧是乙個後進先出的線性表,它要求只在表尾進行刪除和插入操作 棧是一種特殊的線性表 順序表 鍊錶 操作上有一些特殊要求 1.棧的元素必須 後進先出 2.棧的操作只能在這個線性表的表尾進行。注 對於棧來說,表尾稱為棧的棧頂 top 相應的表...
資料結構和演算法學習重點
1 資料結構是指一組資料的儲存結構 2 演算法就是運算元據的方法 3 資料結構和演算法是相輔相成的,資料結構是為演算法服務的,而演算法要作用在特定的資料結構之上。資料結構和演算法解決的是如何更省 更快地儲存和處理資料的問題,因此,我們就需要乙個考量效率和資源消耗的方法,這就是複雜度分析方法。在學習資...