1 動态記憶體配置設定的意義
2 malloc 和 free
2.1 malloc(0) 探究
2.2 記憶體漏洩檢測子產品
3 calloc 和 realloc
4 小結
c 語言中的一切操作都是基于記憶體的
變量和數組都是記憶體的别名
記憶體配置設定由編譯器在編譯期間決定
定義數組的時候必須指定數組的長度
數組長度是在編譯期就必須确定的
可能除了在編譯之前就确定數組的大小,還有别的需求:程式運作的過程中,可能需要使用一些額外的記憶體空間。
malloc 和 free 用于執行動态記憶體配置設定和釋放
malloc 所配置設定的是一塊連續的記憶體
malloc 以位元組為機關,并且不帶有任何的類型資訊
free 用于将動态記憶體歸還系統
void* malloc(size_t size);
void free(void* pointer);
注意:
malloc 和 free 是庫函數,而不是系統調用
malloc 實際配置設定的記憶體可能會比請求的多
不能依賴于不同平台下的 malloc 行為
當請求的動态記憶體無法滿足時,malloc 傳回 null
當 free 的參數為 null時,函數直接傳回
malloc 實際配置設定的記憶體可能會比請求的多:會多出記錄大小的頭;另外,cpu 通路記憶體是按照一種記憶體對齊的方式來通路的,是以一般申請的記憶體都是對齊記憶體的整數倍。
現在有個問題:malloc(0); 将傳回什麼?
下面來實驗一下,
可以看到,傳回了具體的位址
我們所說的記憶體包括起始位址和長度。平時我們說的記憶體更多的是關注了起始位址,而忽略的長度
綜合起始位址和長度,我們使用 malloc(0) 傳回一個位址就不奇怪了,因為這塊記憶體的長度是 0,我們無法使用這塊記憶體,因為長度是 0。
如果我們不停的 malloc(0),會導緻系統的資源耗盡嗎?
答案是會的,因為我們 malloc 的時候,得到的記憶體往往要比實際申請的大,現在記憶體申請一般是 8 位元組對齊
不管 malloc 的參數類型是多大,都需要使用 free 釋放記憶體
calloc 的參數代表所傳回記憶體的類型資訊(第二個參數 size 代表的類型資訊)
calloc 會将傳回的記憶體初始化為 0
realloc 用于修改一個原來已經配置設定的記憶體塊大小
在使用 realloc 之後應該是使用其傳回值
當 pointer 的第一個參數為 null 時,等價于 malloc
執行個體分析:calloc 和 realloc 的使用
分析:
pi 使用 malloc 申請記憶體,随機初始化,ps 使用 calloc 初始化,記憶體初始化為 0。
使用 realloc 修改原來記憶體配置設定的空間,如果擴大了空間,原來的記憶體值不改變,新增加的空間記憶體随機初始化。
首先使用 gcc 編譯器變異,結果如下:
pi 和 ps 的初始化都是 0,這是 linux 的巧合,我們再使用 vs 編譯器嘗試一下。
可以看到,使用 malloc 申請的記憶體随機初始化,使用 realloc 申請的記憶體初始化為 0。
使用 realloc 修改記憶體空間,原來的記憶體值不改變,新增加的空間記憶體随機初始化。
1、動态記憶體配置設定是 c 語言中的強大功能
2、程式能夠在需要的時候有機會使用更多的記憶體
3、malloc 單純的從系統中申請固定位元組大小的記憶體
4、calloc 能以類型大小為機關申請記憶體并初始化為 0
5、realloc 用于重置記憶體大小