C語言程序的動態內存分為棧內存區域和堆內存區域兩種。棧內存是由編譯器管理的,而堆內存是由程序調用具體的庫函數管理的。我們今天分析下棧內存的概念。
棧內存的使用在很大程度上依賴于處理器的硬件機制。在處理器中,一般有一個寄存器來表示當前棧指針的位置,通常在內存中分配一塊區域,這塊內存的上界(高內存地址)和下界(低內存地址)之間是可用的棧內存區域。
棧指針是一個指向棧區域內部的指針,也就是它的值是一個地址,這個地址位于棧區的下界和棧區的上界之間。棧指針把這個棧區域分為兩個部分,一個是已經使用的區域,一個是沒有使用的區域。
對于棧內存的增長方向有兩種:一種是向上增長的,也就是低地址向高地址增長;另一個是向下增長的,高地址向低地址增長。在目前常見的體系結構和編譯系統中,棧大多是向下增長的,我們也是看下這種常見的增長形式。在初始階段,棧指針是指向棧區間的上界。隨著棧使用量的增加,棧指針的值將向低地址移動,也就是在變小。
棧內存在使用過程中有一個重要的特性是先入后出,也就是后入棧的內容將先出棧,而先入棧的后出棧。類似于一個口的瓶子,先進去的在底下,要想底下的出來就先把上面的先倒出來。
入棧的過程和出棧的過程我們安全用圖形來表示,更形象些吧~
在入棧的過程中,如果棧指針的變化超出棧內存的區域,將發生棧溢出。
從圖中看出棧指針的功能是標識當前的棧位置。對棧內存處理中,每次能夠獲取的內容都是最后可放入棧內存的內容,而每次放入棧內存中的內容都將位于棧區域的最后。
總的來說其實棧是一個先入后出的內存區域,棧指針是提供一種硬件的內存機制。
還有一個大家可能都沒聽說過,或者都沒關注過的,我們來一起了解一下,就是滿棧和空棧的概念,我們還是通過圖來形容一下,這個是由處理器的體系結構決定的。與程序的編寫沒有關系,甚至編譯器都不需要關注這個問題。無論在哪種情況下,棧指針都是已經使用的棧區域和未使用的棧區域的分界線。
在滿棧的情況:棧指針當前的位置是已經使用的棧區域。
在空棧的情況:棧指針當期的位置是沒有使用的棧區域。
這個僅供大家了解下就可以了,畢竟對于我們大多數人來說都是應用者,多了解點底層的總沒錯,但也不必太深挖。對于棧內存的概念我就分享到這里,其實這個對于寫匯編的人來說就很有用處了,或者去多讀一些匯編就很能清楚棧內存的妙用了。
后續我分享堆內存的一些概念,話說知識是一點點積累的過程,有時候覺得前面有的知識點懵懵懂懂的突然連起來就又通透了。這就是堅持學習的作用,希望大家都能堅持多學,才能更會用。
編輯:jq
-
C語言
+關注
關注
180文章
7598瀏覽量
136184 -
程序
+關注
關注
116文章
3776瀏覽量
80848
原文標題:C語言中的動態內存-----棧內存
文章出處:【微信號:gh_e7f294a514ca,微信公眾號:單片機匠人】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論