linux 內存分配malloc创坞、calloc平酿、realloc的區(qū)別

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扶认,隨后出現(xiàn)的幾起案子侨拦,更是在濱河造成了極大的恐慌,老刑警劉巖辐宾,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狱从,死亡現(xiàn)場離奇詭異,居然都是意外死亡叠纹,警方通過查閱死者的電腦和手機季研,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉察,“玉大人与涡,你說我怎么就攤上這事。” “怎么了驼卖?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵氨肌,是天一觀的道長。 經常有香客問我酌畜,道長儒飒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任檩奠,我火速辦了婚禮桩了,結果婚禮上,老公的妹妹穿的比我還像新娘埠戳。我一直安慰自己井誉,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布整胃。 她就那樣靜靜地躺著颗圣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屁使。 梳的紋絲不亂的頭發(fā)上在岂,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音蛮寂,去河邊找鬼蔽午。 笑死,一個胖子當著我的面吹牛酬蹋,可吹牛的內容都是我干的及老。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼范抓,長吁一口氣:“原來是場噩夢啊……” “哼骄恶!你這毒婦竟也來了?” 一聲冷哼從身側響起匕垫,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤僧鲁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后象泵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寞秃,經...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年单芜,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜕该。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡洲鸠,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情扒腕,我是刑警寧澤绢淀,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瘾腰,受9級特大地震影響皆的,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蹋盆,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一费薄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栖雾,春花似錦楞抡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至账胧,卻和暖如春竞慢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背治泥。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工筹煮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人居夹。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓寺谤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吮播。 傳聞我的和親對象是個殘疾皇子变屁,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容