malloc,ralloc,calloc函式的用法

2021-07-24 14:57:46 字數 1825 閱讀 2949

(一)malloc.

原型 extern void *malloc(unsigned int num_bytes);

標頭檔案:

#include

#include

功能:

請求系統動態分配num_bytes個位元組的空間,如果分配成功則返回第乙個位元組的位址,並且可以進行強制型別轉換,告訴系統分配空間中儲存的是那種型別的資料。否則返回空指標null。

注意:當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

(二):ralloc

原型:extern void *realloc(void *mem_address,unsigned int newsize);

標頭檔案:#include

功能:

先判斷當前的指標是否有足夠的連續空間,如果有,擴大mem_address指向的位址,並且將mem_address返回,如果空間不夠, 先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來mem_address所指記憶體區域(注意:原來指標是自動釋放,不需要使用free),同時返回新分配的記憶體區域的首位址。即重新分配儲存器塊的位址。

返回值:

如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。

注意:

當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

小結:

1. ralloc失敗的時候,返回null

2. ralloc失敗的時候,原來的記憶體不改變,不會釋放也不會移動

3. 假如原來的記憶體後面還有足夠多剩餘記憶體的話,ralloc的記憶體=原來的記憶體+剩餘記憶體,ralloc還是返回原來記憶體的位址;假如原來的記憶體後面沒有足夠多剩餘記憶體的話,ralloc將申請新的記憶體,然後把原來的記憶體資料拷貝到新記憶體裡,原來的記憶體將被free掉,ralloc返回新記憶體的位址

4. 如果size為0,效果等同於free()。

5. 傳遞給realloc的指標必須是先前通過malloc(), calloc(),或realloc()分配的

6.傳遞給realloc的指標可以為空,等同於malloc。

(三)calloc

函式原型:void *calloc(size_t n, size_t size);

標頭檔案 :#include#include

其三者之間的區別:

(1)函式malloc不能初始化所分配的記憶體空間,也就是說malloc分配好空間後要對所分配的空間進行清理。而函式calloc() 會將所分配的記憶體空間中的每一位都初始化為零,也就是說,如果你是為字元型別或整數型別的元素分配記憶體,那麼這些元素將保證會被初始化為0;如果你是為指標型別的元素分配記憶體,那麼這些元素通常會被初始化為空指標;

(2)函式malloc向系統申請分配指定size個位元組的記憶體空間.返回型別是 void*型別.void*表示未確定型別的指標. void* 型別可以強制轉換為任何其它型別的指標.

實現原理:

將可用的記憶體連線為乙個長長的鍊錶(即所謂的空閒鍊錶)。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊,然後將該記憶體塊一分為二(一塊的大小與使用者申請的大小一樣,另一塊就是剩下的位元組),接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話),返回到鍊錶上,呼叫free函式時,它將使用者釋放的記憶體塊連線到空鏈上,到最後,空閒鍊錶會被切成很多的小記憶體片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可能滿足使用者要求的片段了,於是malloc函式請求延時,並開始在空間中翻箱倒櫃的檢查記憶體片段,對它們進行整理,並將相鄰的小空閒塊合成較大的記憶體塊

GetSystemMetrics 函式的用法

可以用getsystemmetrics函式可以獲取系統解析度,但這只是其功能之一,getsystemmetrics函式只有乙個引數,稱之為 索引 這個索引有75個識別符號,通過設定不同的識別符號就可以獲取系統解析度 窗體顯示區域的寬度和高度 滾動條的寬度和高度。為了使使getsystemmetric...

GetSystemMetrics 函式的用法

可以用getsystemmetrics函式可以獲取系統解析度,但這只是其功能之一,getsystemmetrics函式只有乙個引數,稱之為 索引 這個索引有75個識別符號,通過設定不同的識別符號就可以獲取系統解析度 窗體顯示區域的寬度和高度 滾動條的寬度和高度。為了使使getsystemmetric...

GetSystemMetrics 函式的用法

可以用getsystemmetrics函式可以獲取系統解析度,但這只是其功能之一,getsystemmetrics函式只有乙個引數,稱之為 索引 這個索引有75個識別符號,通過設定不同的識別符號就可以獲取系統解析度 窗體顯示區域的寬度和高度 滾動條的寬度和高度。為了使使getsystemmetric...