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

首頁 > 學院 > 開發設計 > 正文

專題五-內存管理的藝術

2019-11-11 03:02:01
字體:
來源:轉載
供稿:網友

動態內存分配

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

程序中的三國天下

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

程序的內存布局

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

頭疼的野指針

初始野指針(1)野指針通常是因為指針變量中保存的值不是一個合法的內存地址而造成的(2)野指針不是NULL指針,是指向不可用內存的指針(3)NULL指針不容易用錯,因為NULL語句和好判斷一個指針是不是NULLC語言沒有任何手段可以判斷一個指針是否是野指針野指針的由來(1)局部指針變量沒有被初始化(2)使用已經釋放過后的指針(3)指針所指向的變量在指針之前被銷毀經典錯誤,你犯了嗎?非法內存操作分析(1)結構體成員指針未初始化(2)沒有為結構體指針分配足夠的內存d1中的p是野指針,p沒有分配動態內存空間,p指向的是隨機的d2中的p是分配呢5個int,但是分配10個,這種bug很難查內存初始化分析(1)內存分配成功,但未被初始化內存越界分析(1)數組越界內存泄漏分析設計程序最好要單入口單出口多次釋放指針誰申請誰釋放使用已經釋放的指針交通規則,還是應該遵守C語言中的交通規則(1)用malloc申請了內存之后,應該立即檢查指針值是否為NULL,防止使用值為NULL的指針(2)牢記數組長度,防止數組越界操作,考慮使用柔性數組(3)動態申請操作必須和釋放操作匹配,防止內存泄漏和多次釋放(4)free指針之后必須立即賦值為NULL
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大悟县| 巴东县| 江北区| 延津县| 中方县| 泸州市| 镇平县| 永顺县| 沈阳市| 二连浩特市| 台北县| 凤山市| 双柏县| 师宗县| 营山县| 德格县| 西吉县| 泌阳县| 乌兰浩特市| 古丈县| 东丽区| 岑溪市| 阿瓦提县| 青川县| 右玉县| 阳信县| 乐都县| 花莲县| 大丰市| 湖南省| 如皋市| 涟水县| 沙河市| 宣汉县| 龙井市| 桃园市| 三河市| 永康市| 房产| 阳高县| 望江县|