国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

專題五-內(nèi)存管理的藝術(shù)

2019-11-11 01:12:04
字體:
供稿:網(wǎng)友

動態(tài)內(nèi)存分配

為什么使用動態(tài)內(nèi)存分配?(1)C語言中的一切操作都是基于內(nèi)存的(2)變量和數(shù)組都是內(nèi)存的別名,如何分配這些內(nèi)存由編譯器在編譯期間決定.定義數(shù)組的時候必須制定數(shù)組的長度.而數(shù)組長度在編譯期就必須決定的 需求:程序運(yùn)行的過程中,可能需要使用一些額外的內(nèi)存空間malloc和free(1)malloc所分配的是一塊連續(xù)的內(nèi)存,以字節(jié)為單位,并且不帶任何的類型消息(2)free用于將動態(tài)內(nèi)存歸還于系統(tǒng):void* malloc( size_t,size);void free(void* pointer)注意:(1)malloc實際分配的內(nèi)存可能會比請求的稍微多一點(diǎn),但是不能依賴于編譯器的這個行為   (2)當(dāng)請求的動態(tài)內(nèi)存無法滿足時malloc返回NULL   (3)當(dāng)free的參數(shù)為NULL時,函數(shù)直接返回calloc和realloc(1)你認(rèn)識malloc的兄弟嗎? void* calloc(size_t size,size_t num),num為類型的大小,size為元素的數(shù)目(2)calloc的參數(shù)代表所返回內(nèi)存的類型信息(3)calloc會將返回的內(nèi)存初始化為0;malloc分配的值時隨機(jī)的!!!!!void* realloc(void* pointer,size_t new_size)(4)realloc用于修改一個原先已經(jīng)分配的內(nèi)存塊大小,新分配的值也隨機(jī)!!!!!在使用realloc之后應(yīng)該使用其返回值當(dāng)pointer的第一個參數(shù)為NULL時,等價于malloc實例分析:calloc和realloc的使用小結(jié):(1)動態(tài)內(nèi)存分配是C語言中的強(qiáng)大功能(2)程序能夠在需要的時候有機(jī)會使用更多的內(nèi)存(3)malloc單純的從系統(tǒng)的中申請固定字節(jié)大小的內(nèi)存(4)calloc能以類型大小為單位申請內(nèi)存并初始化為0(5)realloc用于重置內(nèi)存大小問題:malloc(0)將返回什么?

程序中的三國天下

程序中的棧(1)棧是現(xiàn)代計算機(jī)程序里最為重要的概念之一(2)棧在程序中用于維護(hù)函數(shù)調(diào)用上下文,沒有棧就沒有函數(shù),沒有局部變量(3)棧保存了一個函數(shù)調(diào)用所需的維護(hù)信息   .函數(shù)參數(shù),函數(shù)返回地址   .局部變量   .函數(shù)調(diào)用上下文程序中的堆(1)為什么有了棧還需要堆?棧上的數(shù)據(jù)在函數(shù)返回之后就會釋放掉,無法傳遞到函數(shù)外部,如:局部數(shù)組(2)堆是程序中一塊巨大的內(nèi)存空間,可由程序自由使用(3)堆中被程序申請使用的內(nèi)存在程序主動釋放前將一直有效malloc從堆中申請內(nèi)存。對空間專門為了動態(tài)內(nèi)存分配而產(chǎn)生的。堆空間通過申請才能獲得(4)系統(tǒng)對堆空間的管理方式.空間鏈表法,位圖法,對象池法等等4與5相近表頭之后指向12個字節(jié),p就指向了5個字節(jié),前面說的 申請的時候內(nèi)存會多一點(diǎn)就是這個意思free就是插入節(jié)點(diǎn)  如果只使用不歸還,只malloc不free會導(dǎo)致什么后果?導(dǎo)致這個鏈表中所有的空閑節(jié)點(diǎn)全部被用完,空閑鏈表的表頭就會指向NULL程序中的靜態(tài)存儲區(qū)(1)程序靜態(tài)存儲區(qū)隨著程序的運(yùn)行而分配空間,直到程序運(yùn)行結(jié)束(2)在程序的編譯期靜態(tài)存儲區(qū)的大小就已經(jīng)確定(3)程序的靜態(tài)存儲區(qū)主要用于保存程序中的全局變量和靜態(tài)變量(4)與棧和堆不同,靜態(tài)存儲區(qū)的信息最終會保存到可執(zhí)行程序中小結(jié)(1)棧,堆和靜態(tài)存儲區(qū)是C語言程序常涉及的三個基本存儲區(qū) (2)棧區(qū)主要用于函數(shù)調(diào)用的使用(3)堆區(qū)主要用于內(nèi)存的動態(tài)申請和歸還(4)靜態(tài)存儲區(qū)用于保存全局變量和靜態(tài)變量 

程序的內(nèi)存布局

  程序文件的一般布局文件布局在內(nèi)存中的映射為什么在前面找不到棧和堆?因為棧和堆是要等到程勛運(yùn)行之后操作系統(tǒng)分配他們的空間的各個段的作用(1)堆棧段在程序運(yùn)行之后才正式存在,是程序運(yùn)行的基礎(chǔ)(2).bss段存放的是未初始化的全局變量和靜態(tài)變量的,全都為0(3).text存放的是程序中的可執(zhí)行代碼(4).data段存放的是那些已經(jīng)初始化了的 全局變量和靜態(tài)變量(5).rodata段存程序中的常量值,如字符常量這樣的字符串肯定不會再棧上分配空間,因為我們main函數(shù)建立的活動記錄里面只可能有指針變量p的空間,不會有helloworld的空間,他放在一個段里面rodata程序術(shù)語對應(yīng)關(guān)系(1)靜態(tài)存儲區(qū)通常指程序中的.bss和.data段(2)只讀區(qū)通常指程序中的.rodata段(3)局部變量所占空間為棧上空間(4)動態(tài)空間為堆中空間(5)程序的可執(zhí)行代碼存放于.text段問題: 函數(shù)的地址對應(yīng)程序的哪一個段?應(yīng)該是我們進(jìn)程空間里面程序的內(nèi)存空間里面存放代碼段的某個地址。同是全局變量和靜態(tài)變量,為什么初始化和未初始化的保存在不同段中呢??????
C規(guī)定,未初始化變量的初值為0,這個清0的操作是由啟動代碼完成的,還有已初始化變量的初值的設(shè)置,也是由啟動代碼完成的。為了啟動代碼的簡單化,編譯鏈接器會把已初始化的變量放在同一個段:.data,這個段的映像(包含了各個變量的初值)保存在“只讀數(shù)據(jù)段”,這樣啟動代碼就可以簡單地復(fù)制這個映像到 .data 段,所有的已初始化變量就都初始化了。而未初始化變量也放在同一個段:.bss,啟動代碼簡單地調(diào)用 memset 就可以把所有未初始化變量都清0。

頭疼的野指針

初始野指針(1)野指針通常是因為指針變量中保存的值不是一個合法的內(nèi)存地址而造成的(2)野指針不是NULL指針,是指向不可用內(nèi)存的指針(3)NULL指針不容易用錯,因為NULL語句和好判斷一個指針是不是NULLC語言沒有任何手段可以判斷一個指針是否是野指針野指針的由來(1)局部指針變量沒有被初始化(2)使用已經(jīng)釋放過后的指針(3)指針?biāo)赶虻淖兞吭谥羔樦氨讳N毀經(jīng)典錯誤,你犯了嗎?非法內(nèi)存操作分析(1)結(jié)構(gòu)體成員指針未初始化(2)沒有為結(jié)構(gòu)體指針分配足夠的內(nèi)存d1中的p是野指針,p沒有分配動態(tài)內(nèi)存空間,p指向的是隨機(jī)的d2中的p是分配呢5個int,但是分配10個,這種bug很難查內(nèi)存初始化分析(1)內(nèi)存分配成功,但未被初始化內(nèi)存越界分析(1)數(shù)組越界內(nèi)存泄漏分析設(shè)計程序最好要單入口單出口多次釋放指針誰申請誰釋放使用已經(jīng)釋放的指針交通規(guī)則,還是應(yīng)該遵守C語言中的交通規(guī)則(1)用malloc申請了內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL,防止使用值為NULL的指針(2)牢記數(shù)組長度,防止數(shù)組越界操作,考慮使用柔性數(shù)組(3)動態(tài)申請操作必須和釋放操作匹配,防止內(nèi)存泄漏和多次釋放(4)free指針之后必須立即賦值為NULL
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 潮安县| 竹溪县| 南充市| 调兵山市| 文登市| 延寿县| 新乐市| 上饶县| 甘肃省| 道真| 阿巴嘎旗| 昭觉县| 融水| 兴安盟| 胶州市| 浏阳市| 雷波县| 临汾市| 特克斯县| 福建省| 和平区| 环江| 乌拉特后旗| 大同市| 汝城县| 花莲县| 芜湖县| 津市市| 安化县| 浏阳市| 穆棱市| 分宜县| 五常市| 河间市| 桑植县| 民勤县| 垦利县| 垦利县| 旌德县| 惠来县| 井冈山市|