在c語言中,記憶體分配的方式不同常常也會影響到程式的執行,所以理解變數等存在的記憶體區別是很有必要的。c語言中的三種記憶體分配方式如下
從靜態儲存區域分配
在棧上分配
從堆上分配
棧:是由編譯器自動分配和釋放的,即在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元將被自動釋放。需要注意的是,棧記憶體分配運算內置於處理器的指令集中,它的執行效率一般很高,但是分配的記憶體容量有限。
int main()
像這種一般在函式內部直接申請的變數所用到的記憶體就是棧分配的,上面這段main函式中所申請的空間在main函式函式執行結束後所有的變數都將被自動釋放。如果是乙個被呼叫的函式,在函式被呼叫的時候申請變數,在函式被呼叫結束的時候就會釋放空間
堆:由程式設計師分配釋放,若程式設計師不釋放,程式結束是由os進行**,它的分配方式類似於鍊錶。程式在執行的時候由程式設計師使用記憶體分配函式(如 malloc 函式)來申請任意多少的記憶體,使用完之後再由程式設計師自己負責使用記憶體釋放函式(如 free 函式)來釋放記憶體。也就是說,動態記憶體的整個生存期是由程式設計師自己決定的,使用非常靈活。需要注意的是,如果在堆上分配了記憶體空間,就必須及時釋放它,否則將會導致執行的程式出現記憶體洩漏等錯誤。
int main()
//使用free函式釋放
free
(p1)
;}
p1的申請空間大小可以根據自己所需要的實際情況來進行定義,(char*)malloc(5)中char*為申請的空間型別,5為申請的數量。在申請空間後記得確認一下是否真正的申請到空間等,申請空間後在free之前所申請是空間除非程式結束,不然會一直存在。
管理方式不同。棧由作業系統自動分配釋放,不需要我們手動控制;堆的申請和釋放工作由程式設計師控制,因此容易產生記憶體洩漏。
空間大小不同。棧的大小一般只有8~10m,而堆有幾個g。
生長方向不同。棧的生長方向向下,記憶體的位址由高到低,堆的生長方向向上,記憶體的位址由低到高。
分配方式不同。堆時動態分配的;棧有兩種分配方式:靜態分配和動態分配。靜態分配是由作業系統完成,比如區域性變數的分配。動態分配由malloc函式進行分配,但是棧的動態分配和堆是不同的,棧的動態分配是由作業系統進行釋放,不需要我們手動釋放。
分配效率不同。棧由作業系統自動分配,會在硬體層級對棧提供支援。分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是由c/c++提供的庫函式或運算子來完成申請與管理,實現機制比較複雜,頻繁的記憶體申請容易產生記憶體碎片。顯然,堆的效率比棧低得多。
分配的碎片問題。對堆來說,頻繁分配和釋放(malloc / free)不同大小的堆空間勢必會造成記憶體空間的不連續,從而造成大量碎片,導致程式效率降低;而對棧來講,則不會存在這個問題。
在資料結構中,棧是一種可以實現「先進後出」(或者稱為「後進先出」)的儲存結構。假設給定棧 s=(a0,a1,…,an-1),則稱 a0 為棧底,an-1 為棧頂。進棧則按照 a0,a1,…,an-1 的順序進行進棧;而出棧的順序則需要反過來,按照「後存放的先取,先存放的後取」的原則進行,則 an-1 先退出棧,然後 an-2 才能夠退出,最後再退出 a0。
對於棧的了解個人認為寫乙個逆波蘭表示式的**能快速的理解棧的「先進後出」
在實際程式設計中,可以通過兩種方式來實現:使用陣列的形式來實現棧,這種棧也稱為靜態棧;使用鍊錶的形式來實現棧,這種棧也稱為動態棧。
相對於棧的「先進後出」特性,堆則是一種經過排序的樹形資料結構,常用來實現優先佇列等。假設有乙個集合 k=,把它的所有元素按完全二叉樹的順序存放在乙個陣列中,並且滿足:
則稱這個集合 k 為最小堆(或者最大堆)。
由此可見,堆是一種特殊的完全二叉樹。其中,節點是從左到右填滿的,並且最後一層的樹葉都在最左邊(即如果乙個節點沒有左兒子,那麼它一定沒有右兒子);每個節點的值都小於(或者都大於)其子節點的值。
C語言中棧和堆 記憶體
棧的特點 是 速度快,儲存小,自動釋放記憶體 比如函式 堆的特點是,速度稍慢於棧,儲存空間大,手動釋放記憶體,呼叫free函式 比如malloc定義大量儲存空間,如果 不釋放記憶體,將一直占用記憶體空間,直到退出程式。記憶體洩漏也稱作 儲存滲漏 用動態儲存分配函式動態開闢的空間,在使用完畢後未釋放,...
C語言中記憶體堆和棧的區別
在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...
C語言中記憶體堆和棧的區別
在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...