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

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

C語言 動態內存分配

2019-11-06 09:54:18
字體:
來源:轉載
供稿:網友

前言 :我們知道內存分為 棧 堆 其實在計算機中是不存在差別的,只是程序員手動分類 方便處理

案例1 我們直接創建一個在棧區的40m大小數組案例2 在堆區創建一個40m的數組案例3 多次動態分配堆內存 不釋放案例4 手動釋放內存案例5 申請內存另一個api案例6 DEMOrealloc

C語言內存分配: 1. 棧區(stack) windows下,棧內存分配2M(確定的常數),超出了限制,提示stack overflow錯誤 自動分配,釋放 2. 堆區(heap) 程序員手動分配釋放,操作系統80%內存 3. 全局區或靜態區 4. 字符常量區 5. 程序代碼區

案例1 我們直接創建一個在棧區的40m大小數組

void main(){ int aaasd[1024 * 1024 * 10];}

這里寫圖片描述

結果:棧溢出

案例2 在堆區創建一個40m的數組

#include <stdlib.h>void main(){ int * a = malloc(sizeof(int)* 1024 * 1024 * 10); getchar();}

malloc函數分配堆內存并返回對應指針 頭文件stdlib.h sizeof 返回對應變量所占字節數

結果:正常 這里寫圖片描述

案例3 多次動態分配堆內存 不釋放

void main(){ int * a = malloc(sizeof(int)* 1024 * 1024 * 10); //休眠程序10秒 頭文件#include <Windows.h> Sleep(10000); a = malloc(sizeof(int)* 1024 * 1024 * 10); getchar();}

在執行睡眠的時候我們看看程序所占內存大小40mb 這里寫圖片描述

睡眠結束后 程序內存變為80mb 這里寫圖片描述

我們申請了兩次內存分別為40mb,發現再第二次申請的時候內存所占變為80 可見第一次申請的內存并沒有釋放

案例4 手動釋放內存

void main(){ int * a = malloc(sizeof(int)* 1024 * 1024 * 10); //釋放 a所指向的內存 free(a); //休眠程序10秒 頭文件#include <Windows.h> Sleep(10000); a = malloc(sizeof(int)* 1024 * 1024 * 10); getchar();}

上面的代碼運行預期結果應該是:手動釋放了第一次申請的40mb 內存 ,然后有申請了一次40mb 所以程序運行結束休眠后應該還是40mb

結果:和預期一致 這里寫圖片描述

案例5 申請內存另一個api

void main(){ //第一個參數申請數量, 每個申請數量的大小 那么這里還是申請40mb int * a = calloc(1024*1024*10,sizeof(int)); getchar();}

案例6 DEMO

void main(){ //第一個參數申請數量, 每個申請數量的大小 那么這里還是申請40mb int * a = calloc(1024*1024*10,sizeof(int)); //內存申請成功 if (a!=NULL) { //xXXXX之后釋放內存 free(a); a = NULL; }else{ //內存申請失敗 } getchar();}

realloc

內存重新分配,當你動態內存申請40mb的數組此時你不夠用怎么辦?便可以重新調用realoc來重新分配內存

void main(){ //第一個參數申請數量, 每個申請數量的大小 那么這里還是申請40mb int * a = calloc(1024 * 1024 * 10, sizeof(int)* 2); //重新申請80mb 第一次申請的內存區域如果和新申請的區域不再同一段 那么 賦值數據到新內存段,并釋放久指針內存區域 int * b=realloc(a, 1024 * 1024 * 10 * sizeof(int)* 2); getchar();}

這里寫圖片描述

注意新申請的內存 可能會在原來內存地址上基礎上擴展/縮小,也有可能在某個新的內存地址段 申請一塊 并且拷貝舊數據到新內存,同時釋放舊內存 百度百科 : realloc分配一個newsize的內存塊,返回一個指向該內存塊的指針。 如果newsize大小為0,那么釋放mem_address指向的內存,并返回NULL。 如果沒有足夠可用的內存用來完成重新分配(擴大原來的內存塊或者分配新的內存塊),則返回NULL。而原來的內存塊保持不變。 現存的數據然后就被拷貝至新的位置,而老塊則放回到堆上.重要的信息就是數據可能被移動

總結:

realloc失敗的時候,返回NULLrealloc失敗的時候,原來的內存不改變,不會釋放也不會移動假如原來的內存后面還有足夠多剩余內存的話,realloc的內存=原來的內存+剩余內存,realloc還是返回原來內存的地址; 假如原來的內存后面沒有足夠多剩余內存的話,realloc將申請新的內存,然后把原來的內存數據拷貝到新內存里,原來的內存將被free掉,realloc返回新內存的地址如果size為0,效果等同于free()。這里需要注意的是只對指針本身進行釋放,例如對二維指針**a,對a調用realloc時只會釋放一維,使用時謹防內存泄露。傳遞給realloc的指針必須是先前通過malloc(), calloc(), 或realloc()分配的 6.傳遞給realloc的指針可以為空,等同于malloc。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 赫章县| 乌拉特后旗| 阿坝县| 尼木县| 泰兴市| 遂宁市| 甘谷县| 平武县| 读书| 栾城县| 靖远县| 兴文县| 高清| 松江区| 德昌县| 万宁市| 淅川县| 比如县| 平陆县| 鄂托克前旗| 宜良县| 富蕴县| 阿瓦提县| 宜春市| 贵港市| 泰兴市| 松原市| 德钦县| 虎林市| 江达县| 肇源县| 桦甸市| 芮城县| 道孚县| 清远市| 安远县| 历史| 泰来县| 大竹县| 沙雅县| 怀来县|