詳解C語言中內(nèi)存分配函數(shù)

很多新學(xué)C語言的童鞋在用到動態(tài)內(nèi)存分配的時(shí)候,對選擇哪種分配函數(shù)及其有何區(qū)別搞不清楚僧界,那么下文就認(rèn)真的講講它們的種種。

(1)C語言的內(nèi)存分配方式

  • 從靜態(tài)存儲區(qū)域分配
    這些在程序編譯的時(shí)候就已經(jīng)分配好梁剔,且在程序的整個(gè)運(yùn)行期間都固定不變豌鹤。

使用這種方式分配內(nèi)存空間的數(shù)據(jù)主要包括:
代碼段(DATA Section)的程序自身語句文本(包括嵌在代碼里的字符串常量)寂呛,已經(jīng)初始化的全局變量靜態(tài)變量 其馏。

.BSS段的未初始化的全局變量骗奖。

  • 在棧stack上分配

這種方式由系統(tǒng)自動分配剧蹂,函數(shù)退出時(shí)也由系統(tǒng)自動釋放声功。

使用這種方式分配內(nèi)存空間的數(shù)據(jù)主要包括:
本地變量函數(shù)參數(shù)

  • 從堆heap上分配,亦稱動態(tài)內(nèi)存分配

程序在運(yùn)行的時(shí)候用malloc類或new動態(tài)申請的內(nèi)存宠叼,由用戶自己負(fù)責(zé)用free或delete釋放先巴。動態(tài)內(nèi)存的生存期由用戶決定,使用非常靈活冒冬,但問題也最多伸蚯。

使用這種方式分配內(nèi)存空間的數(shù)據(jù)主要包括:
自定義輸入緩存用于接收用戶輸入數(shù)據(jù)的變量(數(shù)組、結(jié)構(gòu)體等)

(2)跟內(nèi)存申請相關(guān)的函數(shù)

void* malloc(size_t size)

作用:從堆中分配size個(gè)字節(jié)的空間窄驹,成功則返回空間首地址朝卒,失敗則返回空指針。它的聲明位于stdlib.h頭文件中乐埠。

我們在編程中必須注意分配失敗的情況抗斤,以使程序更加健壯和完備。所以一般會對其進(jìn)行包裝:

void *
xmalloc (size_t size)
{
    void *value = malloc (size);
    if (value == 0)
        fatal ("virtual memory exhausted");
    return value;
}

同時(shí)丈咐,由于它并沒有對分配的空間進(jìn)行任何操作瑞眼,因此基本上malloc之后,需要調(diào)用函數(shù)memset來初始化。

struct foo *ptr;
...
ptr = (struct foo *) malloc (sizeof (struct foo));
if (ptr == 0) 
    abort ();
memset (ptr, 0, sizeof (struct foo));

void * calloc (size_t count, size_t eltsize)

作用:從堆中分配size個(gè)字節(jié)的已經(jīng)清零的空間棵逊,成功則返回空間首地址伤疙,失敗則返回空指針。它的聲明位于stdlib.h頭文件中辆影。

它的實(shí)現(xiàn)等同于:

void *
calloc (size_t count, size_t eltsize)
{
    size_t size = count * eltsize;
    void *value = malloc (size);
    if (value != 0)
        memset (value, 0, size);
    return value;
}

void * realloc (void *ptr, size_t newsize)

作用:用來對之前申請的動態(tài)內(nèi)存重新進(jìn)行分配大小(擴(kuò)容或縮小)徒像。

參數(shù)解釋:ptr必須為之前通過malloc或calloc等函數(shù)申請的動態(tài)內(nèi)存首地址;newsize為你現(xiàn)在需要的大小蛙讥。

注意事項(xiàng):
1 如果是擴(kuò)容锯蛀,它不能保證后加的空間一定是接在原來申請的內(nèi)存空間之后的,因?yàn)橛锌赡芷渲蟮目臻g已經(jīng)被使用了次慢。此時(shí)系統(tǒng)會找一塊大小符合你要求的連續(xù)空間旁涤,并同時(shí)把原來空間內(nèi)容復(fù)制到新空間翔曲,最后再釋放原空間。

2 如果擴(kuò)容失敗劈愚,則原空間內(nèi)容不受影響瞳遍。

3 如果參數(shù)ptr為空,則其動作同malloc菌羽。

但是當(dāng)我們使用時(shí)掠械,為了程序的健壯性和完備性,在使用時(shí)我們需要包裝一下:

void *
xrealloc (void *ptr, size_t size)
{
    void *value = realloc (ptr, size);
    if (value == 0)
        fatal ("Virtual memory exhausted");
    else
        return value;

void * reallocarray (void *ptr, size_t nmemb, size_t size)

該函數(shù)作用及各參數(shù)同realloc算凿,唯一的不同是當(dāng)發(fā)生乘法溢出時(shí)份蝴,會進(jìn)行錯(cuò)誤提示。

void * aligned_alloc (size_t alignment, size_t size)

作用:函數(shù)分配一個(gè)地址alignment對齊的大小為size的內(nèi)存空間氓轰。

參數(shù)解釋:alignment代表地址對齊參數(shù),必須為2的倍數(shù)浸卦,且size也必須是alignment的倍數(shù)署鸡。
如果分配成功則返回內(nèi)存首地址,否則返回空限嫌,同時(shí)依據(jù)錯(cuò)誤原因設(shè)置錯(cuò)誤代碼errno為ENOMEN或EINVAL

還有 58% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
支付 ¥1.00 繼續(xù)閱讀
  • 序言:七十年代末靴庆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子怒医,更是在濱河造成了極大的恐慌炉抒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚叹,死亡現(xiàn)場離奇詭異焰薄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扒袖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門塞茅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人季率,你說我怎么就攤上這事野瘦。” “怎么了飒泻?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵鞭光,是天一觀的道長。 經(jīng)常有香客問我泞遗,道長惰许,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任刹孔,我火速辦了婚禮啡省,結(jié)果婚禮上娜睛,老公的妹妹穿的比我還像新娘。我一直安慰自己卦睹,他們只是感情好畦戒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著结序,像睡著了一般障斋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徐鹤,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天垃环,我揣著相機(jī)與錄音,去河邊找鬼返敬。 笑死遂庄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劲赠。 我是一名探鬼主播涛目,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凛澎!你這毒婦竟也來了霹肝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤塑煎,失蹤者是張志新(化名)和其女友劉穎沫换,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體最铁,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讯赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炭晒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片待逞。...
    茶點(diǎn)故事閱讀 38,777評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖网严,靈堂內(nèi)的尸體忽然破棺而出识樱,到底是詐尸還是另有隱情,我是刑警寧澤震束,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布怜庸,位于F島的核電站,受9級特大地震影響垢村,放射性物質(zhì)發(fā)生泄漏割疾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一嘉栓、第九天 我趴在偏房一處隱蔽的房頂上張望宏榕。 院中可真熱鬧拓诸,春花似錦、人聲如沸麻昼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抚芦。三九已至倍谜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叉抡,已是汗流浹背尔崔。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褥民,地道東北人季春。 一個(gè)月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像轴捎,于是被迫代替她去往敵國和親鹤盒。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容