內(nèi)存技術(shù)中堆棧溢出原理是什么-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)內(nèi)存技術(shù)中堆棧溢出原理是什么,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供新市網(wǎng)站建設(shè)、新市做網(wǎng)站、新市網(wǎng)站設(shè)計(jì)、新市網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、新市企業(yè)網(wǎng)站模板建站服務(wù),十余年新市做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

堆棧(Stack)是一種抽象數(shù)據(jù)結(jié)構(gòu),是一組相同數(shù)據(jù)類型的組合,所有的操作均在堆棧頂端進(jìn)行,具有“后進(jìn)先出”的特性,即最后一個(gè)放入堆棧中的物體總是被最先拿出來。堆棧中兩個(gè)最重要的是PUSH(進(jìn)棧)和POP(出棧),PUSH操作在堆棧的頂部加入一個(gè)元素,POP操作相反,在堆棧頂部移去一個(gè)元素,并將堆棧的大小減一。水滿則溢,堆棧是有一定容量限制的,當(dāng)超出了該容量限制,就會(huì)發(fā)生溢出。

堆棧溢出是什么

內(nèi)存中的堆與棧

事實(shí)上,堆和棧是不同的數(shù)據(jù)結(jié)構(gòu)概念,堆棧溢出也可細(xì)化為堆溢出和棧溢出兩種。棧有兩個(gè)特性:只能從棧的頂端存取數(shù)據(jù);數(shù)據(jù)的存取符合后進(jìn)先出的原則。所謂后進(jìn)先出,其實(shí)就如同自助餐中餐盤在桌面上一個(gè)一個(gè)往上疊放,在取用時(shí)先拿最上面的餐盤,這是典型的堆棧概念的應(yīng)用。堆是一種樹結(jié)構(gòu),準(zhǔn)確地說是一個(gè)完全二叉樹。

在內(nèi)存中,當(dāng)一個(gè)可執(zhí)行程序被裝入到內(nèi)存時(shí),主要包括兩個(gè)部分:代碼和數(shù)據(jù)。代碼會(huì)被裝入到內(nèi)存中的代碼區(qū),數(shù)據(jù)區(qū)又由3部分組成:①全局變量:根據(jù)其是否有初始值,被裝入到內(nèi)存中的未初始化數(shù)據(jù)區(qū)和初始化數(shù)據(jù)區(qū);②局部變量:在函數(shù)調(diào)用發(fā)生時(shí)存放在棧中;③動(dòng)態(tài)內(nèi)存空間:在程序運(yùn)行時(shí)申請的動(dòng)態(tài)內(nèi)存空間存放在堆中。

棧區(qū)(stack)是后進(jìn)先出的結(jié)構(gòu),向低地址進(jìn)行擴(kuò)展,是一塊連續(xù)的內(nèi)存區(qū)域,棧頂?shù)牡刂泛蜅5妮^大容量是系統(tǒng)預(yù)先規(guī)定的,只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報(bào)異常來提示棧發(fā)生溢出。??臻g是系統(tǒng)自動(dòng)分配、釋放的,存放函數(shù)的參數(shù)值、局部變量的值等。一般來說,進(jìn)棧的順序首先為主函數(shù)中的下一條指令(函數(shù)調(diào)用語句的下一條可執(zhí)行語句)的地址先進(jìn)棧,其次是參數(shù)由右往左依次進(jìn)棧,最后是函數(shù)中的局部變量進(jìn)棧,出棧順序與進(jìn)棧順序相反,對于程序來說,出棧就意味著函數(shù)執(zhí)行完畢,函數(shù)空間將被系統(tǒng)完全釋放掉。

堆區(qū)一般由程序員自己申請,并指明大小,程序最后進(jìn)行釋放,若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)回收(注意,如果是C/C++語言,程序不進(jìn)行對空間回收,而Java語言中有專門的垃圾回收器進(jìn)行回收),堆區(qū)與數(shù)據(jù)結(jié)構(gòu)中的堆有所不同,分配方式類似于鏈表。堆區(qū)向高地址擴(kuò)展。

堆棧溢出原理

堆棧溢出是說堆區(qū)和棧區(qū)的溢出,二者同屬于緩沖區(qū)溢出。從上面關(guān)于堆區(qū)和棧區(qū)的解釋可以看出,一旦程序確定,堆棧內(nèi)存空間的大小就是固定的,當(dāng)數(shù)據(jù)已經(jīng)把堆棧的空間占滿時(shí),再往里面存放數(shù)據(jù)就會(huì)超出容量,發(fā)生上溢;當(dāng)堆棧中的已經(jīng)沒有數(shù)據(jù)時(shí),再取數(shù)據(jù)就無法取到了,發(fā)生下溢。需要注意的是,棧分為順序棧和鏈棧,鏈棧不會(huì)發(fā)生溢出,順序棧會(huì)發(fā)生溢出。

關(guān)于“內(nèi)存技術(shù)中堆棧溢出原理是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

文章標(biāo)題:內(nèi)存技術(shù)中堆棧溢出原理是什么-創(chuàng)新互聯(lián)
鏈接地址:http://muchs.cn/article36/dspppg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營銷推廣品牌網(wǎng)站建設(shè)、網(wǎng)站營銷、網(wǎng)頁設(shè)計(jì)公司營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)