1. malloc/calloc/realloc和free介紹:
1. malloc函數(shù)
malloc函數(shù)可以從堆上獲得指定字節(jié)的內存空間凤优,其函數(shù)聲明如下:
void * malloc(int n);
參數(shù)釋義:
n:申請空間大小(單個類型大小*總個數(shù))
函數(shù)詳述:
其中蜈彼,形參n為要求分配的字節(jié)數(shù)筑辨。如果函數(shù)執(zhí)行成功,malloc返回獲得內存空間的首地址幸逆;如果函數(shù)執(zhí)行失敗棍辕,那么返回值為NULL。由于malloc函數(shù)值的類型為void型指針还绘,因此楚昭,可以將其值類型轉換后賦給任意類型指針,這樣就可以通過操作該類型指針來操作從堆上獲得的內存空間拍顷。
需要注意的是,malloc函數(shù)分配得到的內存空間是未初始化的抚太。
注意:通過malloc函數(shù)得到的堆內存必須使用memset函數(shù)來初始化。
2. calloc函數(shù)
calloc函數(shù)的功能與malloc函數(shù)的功能相似菇怀,都是從堆分配內存凭舶。其函數(shù)聲明如下:
void *calloc(int n,int size);
參數(shù)釋義:
size:單個類型大小
n:申請的個數(shù)
注意:最后申請空間大小為: n和size相乘
函數(shù)詳述:
函數(shù)返回值為void型指針晌块。如果執(zhí)行成功,函數(shù)從堆上獲得size * n的字節(jié)空間帅霜,并返回該空間的首地址匆背。如果執(zhí)行失敗,函數(shù)返回NULL身冀。該函數(shù)與malloc函數(shù)的一個顯著不同時是钝尸,calloc函數(shù)得到的內存空間是經過初始化的,其內容全為0搂根。calloc函數(shù)適合為數(shù)組申請空間珍促,可以將size設置為數(shù)組元素的空間長度,將n設置為數(shù)組的容量剩愧。
3. realloc函數(shù)
realloc函數(shù)的功能比malloc函數(shù)和calloc函數(shù)的功能更為豐富猪叙,可以實現(xiàn)內存分配和內存釋放的功能,其函數(shù)聲明如下:
void * realloc(void * p,int n);
參數(shù)釋義:
p:堆上已經存在空間的地址
n:空間的大小
函數(shù)詳述:
其中仁卷,指針p必須為指向堆內存空間的指針穴翩,即由malloc函數(shù)、calloc函數(shù)或realloc函數(shù)分配空間的指針锦积。realloc函數(shù)將指針p指向的內存塊的大小改變?yōu)閚字節(jié)芒帕。如果n小于或等于p之前指向的空間大小,那么丰介。保持原有狀態(tài)不變背蟆。如果n大于原來p之前指向的空間大小,那么哮幢,系統(tǒng)將重新為p從堆上分配一塊大小為n的內存空間带膀,同時,將原來指向空間的內容依次復制到新的內存空間上家浇,p之前指向的空間被釋放本砰。relloc函數(shù)分配的空間也是未初始化的碴裙。
注意:使用malloc函數(shù)钢悲,calloc函數(shù)和realloc函數(shù)分配的內存空間都要使用free函數(shù)或指針參數(shù)為NULL的realloc函數(shù)來釋放。
2.2使用方法:
1舔株、malloc()
頭文件:stdlib.h
聲明:void * malloc(int n);
含義:在堆上莺琳,分配n個字節(jié),并返回void指針類型载慈。
返回值:分配內存成功惭等,返回分配的堆上存儲空間的首地址;否則办铡,返回NULL
初始化:未初始化
2辞做、calloc()
頭文件:stdlib.h
聲明:void *calloc(int n, int size);
含義:在堆上琳要,分配nsize個字節(jié),并初始化為0秤茅,返回void 類型
返回值:同malloc() 函數(shù)
初始化:已初始化
3稚补、recalloc()
頭文件:stdlib.h
聲明:void * realloc(void * p,int n);
含義:重新分配堆上的void指針p所指的空間為n個字節(jié),同時會復制原有內容到新分配的堆上存儲空間框喳。注意课幕,若原來的void指針p在堆上的空間不大于n個字節(jié),則保持不變五垮。
返回值:同malloc() 函數(shù)
初始化:未初始化
4乍惊、free()
頭文件:stdlib.h
聲明:void free (void * p);
含義:釋放void指針p所指的堆上的空間。
返回值:無
5放仗、memset()
頭文件:string.h
聲明:void * memset (void * p, int c, int n) ;
含義:對于void指針p為首地址的n個字節(jié)润绎,將其中的每個字節(jié)設置為c。
返回值:返回指向存儲區(qū)域 p 的void類型指針诞挨。
2.3malloc/calloc/realloc區(qū)別總結
相同點:
1.都是從堆上申請空間
2.都需要對返回值判空
3.都需要用戶free釋放
4.返回值類型相同(void*)
5.都需要類型轉化
6.底層實現(xiàn)上是一樣的凡橱,都需要開辟多余的空間,用來維護申請的空間
可以輸入以下代碼觀測內存:
#include <stdio.h>
#include <malloc.h>
int main(){
int *p= (int *)malloc(sizeof(int )*10);
return 0;
}
不同點:
1.函數(shù)名字不同和參數(shù)類型不同亭姥。
2.calloc會對申請空間初始化稼钩,并且初始化為0,而其他兩個不會达罗。
3.malloc申請的空間必須使用memset初始化
4.realloc是對已經存在的空間進行調整坝撑,當?shù)谝粋€參數(shù)傳入NULL的時候和malloc一樣
調整分為兩種情況:
a:調整的空間比原有空間大:
1.大了一點:多出來的空間小于小于下面空閑的空間;
做法:
1.直接延伸申請空間
2.返回原空間首地址**
2.大了很多:多出來的空間粮揉,大于下面空閑空間
做法:
1.重新開辟新空間
2.將舊空間的內容拷貝到新空間中
3.釋放舊空間
4.返回新空間的首地址
b.調整的空間比原有空間醒怖睢:
做法:
1.將原空間縮小
2 .返回舊空間首地址
原文鏈接:https://blog.csdn.net/qq_38810767/article/details/85265541