溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

內(nèi)存技術(shù)中堆棧溢出原理是什么

發(fā)布時(shí)間:2021-03-10 14:56:06 來源:億速云 閱讀:175 作者:小新 欄目:開發(fā)技術(shù)

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

  堆棧(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í)申請(qǐng)的動(dòng)態(tài)內(nèi)存空間存放在堆中。

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

  堆區(qū)一般由程序員自己申請(qǐng),并指明大小,程序最后進(jìn)行釋放,若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)回收(注意,如果是C/C++語(yǔ)言,程序不進(jìn)行對(duì)空間回收,而Java語(yǔ)言中有專門的垃圾回收器進(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)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI