C語言編程中的“堆”和“棧”七大不同之處

對(duì)于編程初學(xué)者來說會(huì)接觸到一些難以理解的名稱锨侯,比如堆(heap)嫩海、棧(stack)、堆棧(stack)等囚痴。初學(xué)開發(fā)過程中往往讓人混淆不清叁怪。今天我們來談?wù)劧押蜅5木唧w區(qū)別,來幫助初學(xué)者理清思路深滚。

堆和棧的區(qū)別一直都是永恒的話題奕谭,為此筆者也查了很多的資料,以防自己的理解錯(cuò)誤痴荐,而給他人造成理解偏差展箱。

“堆”和“棧”

先從簡單的一個(gè)例子引出堆和棧:

void function()

{

int *p = (int *)malloc(10*sizeof(int));

}

這是C語言開發(fā)學(xué)習(xí)過程中蹬昌,必不可免要學(xué)習(xí)的知識(shí),動(dòng)態(tài)分配一塊空間攀隔,空間在堆區(qū)大小是40字節(jié)(32位系統(tǒng)中)皂贩。而定義的指針變量p是局部變量,在棧區(qū)中 占用4字節(jié)空間昆汹,用來存放剛剛前面動(dòng)態(tài)分配的空間的首地址明刷。

可以看出,在這一句代碼中同時(shí)包含了棧和堆满粗,如下圖所示辈末。

堆和棧

堆和棧的區(qū)別


我們從以下幾個(gè)方面比較一下堆和棧:

1、存儲(chǔ)內(nèi)容不同

棧:在函數(shù)調(diào)用時(shí),棧中存放的是函數(shù)中各個(gè)參數(shù)(局部變量)挤聘。棧底下是函數(shù)調(diào)用后的下一條指令轰枝。

堆:一般是在堆的頭部用一個(gè)字節(jié)存放堆的大小。堆中的具體內(nèi)容有程序員安排组去。

2鞍陨、管理方式上不同

棧:由系統(tǒng)自動(dòng)分配空間,同時(shí)系統(tǒng)自動(dòng)釋放空間从隆。例如诚撵,聲明在函數(shù)中一個(gè)局部變量“int b“。系統(tǒng)自動(dòng)在棧中為b開辟空間键闺,當(dāng)對(duì)應(yīng)的生存周期結(jié)束后検傺蹋空間自動(dòng)釋放。

堆:需要程序員手動(dòng)申請(qǐng)并且手動(dòng)釋放辛燥,并指明大小筛武。在C語言中malloc函數(shù)申請(qǐng),釋放free函數(shù)购桑,在C++中new和delete實(shí)現(xiàn)畅铭。

3、空間大小不同

棧:獲取空間較小勃蜘。在Windows下硕噩,一般大小是1M或2M,當(dāng)剩余楃怨保空間不足時(shí)炉擅,分配失敗overflow。

堆:獲得空間根據(jù)系統(tǒng)的有效虛擬內(nèi)存有關(guān)阳惹,比較靈活谍失,比較大。

4莹汤、能否產(chǎn)生碎片不同

棧:不會(huì)產(chǎn)生碎片快鱼,空間連續(xù)。

堆:采用的是鏈表的存儲(chǔ)方式纲岭,會(huì)產(chǎn)生碎片抹竹。



小編給大家推薦一個(gè)學(xué)習(xí)氛圍超好的地方,C/C++交流企鵝裙:【8.7.0+九.六.三+2.5.1】適合在校大學(xué)生止潮,小白窃判,想轉(zhuǎn)行,想通過這個(gè)找工作的加入喇闸。裙里有大量學(xué)習(xí)資料袄琳,有大神解答交流問題询件,每晚都有免費(fèi)的直播課程


5、生長方向不同

棧:向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)唆樊,是一塊連續(xù)的內(nèi)存的區(qū)域宛琅。

堆:向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域窗轩。這是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的夯秃,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址痢艺。

6仓洼、分配方式不同

棧:有2種分配方式——靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)由編譯器完成堤舒,例如局部變量;動(dòng)態(tài)由alloca函數(shù)實(shí)現(xiàn)色建,并且編譯器會(huì)進(jìn)行釋放。

堆:都是動(dòng)態(tài)分配的舌缤,沒有靜態(tài)分配的堆箕戳。

7、分配效率不同

棧:由系統(tǒng)自動(dòng)分配国撵,速度較快陵吸。但程序員是無法控制的。

堆:由new分配的內(nèi)存介牙,一般速度比較慢壮虫,而且容易產(chǎn)生內(nèi)存碎片,不過用起來方便环础。

以上是棧和堆幾個(gè)方面的不同囚似,希望通過上面的資料可以幫助初學(xué)者分清堆和棧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末线得,一起剝皮案震驚了整個(gè)濱河市饶唤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贯钩,老刑警劉巖募狂,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異角雷,居然都是意外死亡祸穷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門谓罗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人季二,你說我怎么就攤上這事檩咱〗掖耄” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵刻蚯,是天一觀的道長绊含。 經(jīng)常有香客問我,道長炊汹,這世上最難降的妖魔是什么躬充? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮讨便,結(jié)果婚禮上充甚,老公的妹妹穿的比我還像新娘。我一直安慰自己霸褒,他們只是感情好伴找,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著废菱,像睡著了一般技矮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殊轴,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天衰倦,我揣著相機(jī)與錄音,去河邊找鬼旁理。 笑死樊零,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的韧拒。 我是一名探鬼主播淹接,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叛溢!你這毒婦竟也來了塑悼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤楷掉,失蹤者是張志新(化名)和其女友劉穎厢蒜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烹植,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斑鸦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了草雕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巷屿。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖墩虹,靈堂內(nèi)的尸體忽然破棺而出嘱巾,到底是詐尸還是另有隱情憨琳,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布旬昭,位于F島的核電站篙螟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏问拘。R本人自食惡果不足惜遍略,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骤坐。 院中可真熱鬧绪杏,春花似錦、人聲如沸或油。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顶岸。三九已至腔彰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辖佣,已是汗流浹背霹抛。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卷谈,地道東北人杯拐。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像世蔗,于是被迫代替她去往敵國和親端逼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容