c語(yǔ)言?xún)?nèi)存管理機(jī)制

c語(yǔ)言?xún)?nèi)存管理機(jī)制

ID:11285219

大?。?7.50 KB

頁(yè)數(shù):4頁(yè)

時(shí)間:2018-07-11

c語(yǔ)言?xún)?nèi)存管理機(jī)制_第1頁(yè)
c語(yǔ)言?xún)?nèi)存管理機(jī)制_第2頁(yè)
c語(yǔ)言?xún)?nèi)存管理機(jī)制_第3頁(yè)
c語(yǔ)言?xún)?nèi)存管理機(jī)制_第4頁(yè)
資源描述:

《c語(yǔ)言?xún)?nèi)存管理機(jī)制》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。

1、C/C++程序的內(nèi)存管理機(jī)制1.分區(qū)管理一個(gè)由C/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分:(1)棧區(qū)(stack):由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧,地址由高向低延伸。(2)堆區(qū)(heap):一般由程序員分配釋放,由程序執(zhí)行過(guò)程中動(dòng)態(tài)申請(qǐng)分配的內(nèi)存,地址由低向高延伸,與棧區(qū)正好相反。若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式類(lèi)似于鏈表。(3)全局區(qū)(靜態(tài)區(qū)static):全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局

2、變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后有系統(tǒng)釋放。(4)文字常量區(qū):常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放。(5)程序代碼區(qū):存放函數(shù)體得二進(jìn)制代碼。如圖1所示。圖1內(nèi)存映象圖如圖所示,內(nèi)存中的棧區(qū)處于相對(duì)較高的地址。棧地址是向下延伸的,棧中分配局部變量空間,堆區(qū)是向上增長(zhǎng)的用于分配程序員申請(qǐng)的內(nèi)存空間。另外還有靜態(tài)區(qū)是分配靜態(tài)變量,全局變量空間的;只讀區(qū)是分配常量和程序代碼空間的;以及其他一些分區(qū)。?2.概念說(shuō)明與舉例?(1)堆和棧數(shù)據(jù)結(jié)構(gòu)課程講解的堆棧是一種LIFO結(jié)構(gòu),即后進(jìn)先出的結(jié)構(gòu),有時(shí)簡(jiǎn)稱(chēng)為棧。在現(xiàn)實(shí)生活中有許多實(shí)例,比

3、如人們生活中穿衣和脫衣,如果每次只能穿一件或脫一件的話(huà),就是這種結(jié)構(gòu)。C語(yǔ)言在實(shí)現(xiàn)中很多地方使用了這種結(jié)構(gòu)嗎,比如函數(shù)調(diào)用等。?堆是一種經(jīng)過(guò)排序的樹(shù)形數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都有一個(gè)值。通常所說(shuō)的堆的數(shù)據(jù)結(jié)構(gòu),是指二叉堆。堆的特點(diǎn)是根結(jié)點(diǎn)的值最?。ɑ蜃畲螅?,且根結(jié)點(diǎn)的兩個(gè)子樹(shù)也是一個(gè)堆。由于堆的這個(gè)特性,常用來(lái)實(shí)現(xiàn)優(yōu)先隊(duì)列。?然而C語(yǔ)言存儲(chǔ)數(shù)據(jù)的堆和棧并不是數(shù)據(jù)結(jié)構(gòu)的堆和棧,之所以要說(shuō)數(shù)據(jù)結(jié)構(gòu)的堆和棧是為了和后面要說(shuō)的堆區(qū)和棧區(qū)區(qū)別開(kāi)來(lái)。????下面就說(shuō)說(shuō)C語(yǔ)言程序內(nèi)存分配中的堆和棧,這里有必要把內(nèi)存分配也提一下,一般情況下程序存放在Rom或Flash中,運(yùn)行時(shí)

4、需要拷到內(nèi)存中執(zhí)行,內(nèi)存會(huì)分別存儲(chǔ)不同的信息。例1:五種內(nèi)存區(qū)舉例?main.cpp#include#includeinta=0;//全局初始化區(qū)char*p1;//全局未初始化區(qū)main(){intb;//棧chars[]="abc";//棧char*p2;//棧char*p3="123456";//"123456