C語言程序的動(dòng)態(tài)內(nèi)存分為棧內(nèi)存區(qū)域和堆內(nèi)存區(qū)域兩種。棧內(nèi)存是由編譯器管理的,而堆內(nèi)存是由程序調(diào)用具體的庫函數(shù)管理的。我們今天分析下棧內(nèi)存的概念。
棧內(nèi)存的使用在很大程度上依賴于處理器的硬件機(jī)制。在處理器中,一般有一個(gè)寄存器來表示當(dāng)前棧指針的位置,通常在內(nèi)存中分配一塊區(qū)域,這塊內(nèi)存的上界(高內(nèi)存地址)和下界(低內(nèi)存地址)之間是可用的棧內(nèi)存區(qū)域。
棧指針是一個(gè)指向棧區(qū)域內(nèi)部的指針,也就是它的值是一個(gè)地址,這個(gè)地址位于棧區(qū)的下界和棧區(qū)的上界之間。棧指針把這個(gè)棧區(qū)域分為兩個(gè)部分,一個(gè)是已經(jīng)使用的區(qū)域,一個(gè)是沒有使用的區(qū)域。
對(duì)于棧內(nèi)存的增長方向有兩種:一種是向上增長的,也就是低地址向高地址增長;另一個(gè)是向下增長的,高地址向低地址增長。在目前常見的體系結(jié)構(gòu)和編譯系統(tǒng)中,棧大多是向下增長的,我們也是看下這種常見的增長形式。在初始階段,棧指針是指向棧區(qū)間的上界。隨著棧使用量的增加,棧指針的值將向低地址移動(dòng),也就是在變小。
棧內(nèi)存在使用過程中有一個(gè)重要的特性是先入后出,也就是后入棧的內(nèi)容將先出棧,而先入棧的后出棧。類似于一個(gè)口的瓶子,先進(jìn)去的在底下,要想底下的出來就先把上面的先倒出來。
入棧的過程和出棧的過程我們安全用圖形來表示,更形象些吧~
在入棧的過程中,如果棧指針的變化超出棧內(nèi)存的區(qū)域,將發(fā)生棧溢出。
從圖中看出棧指針的功能是標(biāo)識(shí)當(dāng)前的棧位置。對(duì)棧內(nèi)存處理中,每次能夠獲取的內(nèi)容都是最后可放入棧內(nèi)存的內(nèi)容,而每次放入棧內(nèi)存中的內(nèi)容都將位于棧區(qū)域的最后。
總的來說其實(shí)棧是一個(gè)先入后出的內(nèi)存區(qū)域,棧指針是提供一種硬件的內(nèi)存機(jī)制。
還有一個(gè)大家可能都沒聽說過,或者都沒關(guān)注過的,我們來一起了解一下,就是滿棧和空棧的概念,我們還是通過圖來形容一下,這個(gè)是由處理器的體系結(jié)構(gòu)決定的。與程序的編寫沒有關(guān)系,甚至編譯器都不需要關(guān)注這個(gè)問題。無論在哪種情況下,棧指針都是已經(jīng)使用的棧區(qū)域和未使用的棧區(qū)域的分界線。
在滿棧的情況:棧指針當(dāng)前的位置是已經(jīng)使用的棧區(qū)域。
在空棧的情況:棧指針當(dāng)期的位置是沒有使用的棧區(qū)域。
這個(gè)僅供大家了解下就可以了,畢竟對(duì)于我們大多數(shù)人來說都是應(yīng)用者,多了解點(diǎn)底層的總沒錯(cuò),但也不必太深挖。對(duì)于棧內(nèi)存的概念我就分享到這里,其實(shí)這個(gè)對(duì)于寫匯編的人來說就很有用處了,或者去多讀一些匯編就很能清楚棧內(nèi)存的妙用了。
后續(xù)我分享堆內(nèi)存的一些概念,話說知識(shí)是一點(diǎn)點(diǎn)積累的過程,有時(shí)候覺得前面有的知識(shí)點(diǎn)懵懵懂懂的突然連起來就又通透了。這就是堅(jiān)持學(xué)習(xí)的作用,希望大家都能堅(jiān)持多學(xué),才能更會(huì)用。
編輯:jq
-
C語言
+關(guān)注
關(guān)注
183文章
7645瀏覽量
146085 -
程序
+關(guān)注
關(guān)注
117文章
3847瀏覽量
85437
原文標(biāo)題:C語言中的動(dòng)態(tài)內(nèi)存-----棧內(nèi)存
文章出處:【微信號(hào):gh_e7f294a514ca,微信公眾號(hào):單片機(jī)匠人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何為 S32DS 中的特定變量(RAM、閃存、數(shù)據(jù)閃存)強(qiáng)制使用特定內(nèi)存區(qū)域?
MangoTree Halo Ultra「全新PXI」,標(biāo)配自動(dòng)糾錯(cuò)內(nèi)存#
容易造成單片機(jī)內(nèi)存溢出的幾個(gè)陷阱介紹
keil中c語言的動(dòng)態(tài)分配內(nèi)存
【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配
C語言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作
三種類型內(nèi)存的使用
C語言內(nèi)存池使用
堆和棧的區(qū)別
C語言的編程技巧
為什么單片機(jī)中很少使用malloc,而PC程序頻繁使用呢?
靈活高效ZBUFF — C內(nèi)存數(shù)據(jù)操作庫:優(yōu)化內(nèi)存管理的利器
靈活高效雙引擎驅(qū)動(dòng):ZBUFF讓C語言內(nèi)存操作更智能!
C語言程序的動(dòng)態(tài)內(nèi)存中棧內(nèi)存區(qū)域的概念
評(píng)論