堆(heap)與棧(stack)的區別(二)
阿新 • • 發佈:2018-12-14
程式的執行場所是記憶體,棧和堆是程序的虛擬記憶體中的兩部分割槽域。
當程式被執行時,程式程式碼,你所建立的變數、常量等都會被壓入棧空間裡,棧是程式程式碼的執行區域。棧的記憶體地址是連續的且被一一記錄,所以說當你建立了一個變數(比如int var = 1),我們就可以通過var這個變數來訪問變數的內容。在這裡,var就存放在棧中,它的地址已經預設被編譯器計算好了,呼叫過程也不需要你涉及到有關地址的操作。更直觀的感受是陣列,數組裡的元素在棧裡面是連續排放的,相鄰兩個元素的地址相差1。
而堆是不同於棧的另一部分割槽域,系統會給每個程式分配一部分棧空間讓他們能夠執行起來,問題就是棧空間必然存在不夠用的問題,而堆不屬於程式,堆是獨立的,是公用的。只要你malloc(sizeof(SIZE_YOU_WANT)),就可以得到相應一部分的堆空間。
有棧,為什麼用堆?
::棧裡面的東西有生命週期,說俗點就是變數作用域,你在函式內部建立一個變數,函式呼叫結束這個變數就沒了。而堆裡面的東西獨立於你的程式,malloc()之後,除非你free()掉,否則一直存在。
為什麼用堆少?
::麻煩!
有什麼要注意?
::堆裡面申請的東西,是隨機分配的,不像棧裡面的地址都已經計算好了。所以申請了堆空間之後一定要建立一個指標儲存你說申請到的堆空間的地址。不然就找不到你申請的空間了。
既然涉及到指標,請注意用之前檢查一下指標空不空的問題。
堆空間的東西申請好,在用完之後一定要free()掉,以防止堆溢位。
說到安全性,還真是挺麻煩的。