2019-05-12 內(nèi)存四區(qū)詳解

如靜制動 如影隨形

[1] 編程所需兩種基本能力

  • 接口的封裝和設(shè)計能力(功能抽象分封裝)
    1)接口api的使用能力
    2)接口api的查找能力(快速上手)
    3)接口api的實現(xiàn)能力

  • 建立正確程序運行內(nèi)存布局圖(印象圖)
    1)建立內(nèi)存四區(qū)模型圖
    2)函數(shù)調(diào)用模型圖

[2]內(nèi)存四區(qū)(堆谁榜、棧、全局區(qū)、代碼區(qū))

  • 綜述
    在C語言程序中,代碼在內(nèi)存中進(jìn)行執(zhí)行的時候,我們粗略的將程序所占的內(nèi)存分為四個區(qū)域---棧區(qū)雅宾,堆區(qū)、全局區(qū)、代碼區(qū)侥涵。每個程序都有唯一的四個內(nèi)存區(qū)域。我們需要熟悉和了解各個區(qū)域的特性,例如存儲什么類型的數(shù)據(jù), 有誰去申請開辟, 又有誰去管理釋放等等宋雏。

  • 內(nèi)存四區(qū)介紹
    <1>棧區(qū)
    由編譯器自動分配釋放芜飘,存放函數(shù)的參數(shù)值,局部變量等磨总。
    例如: 參數(shù)buf,參數(shù)bufsize和size都是存放在棧區(qū).當(dāng)函數(shù)執(zhí)行完畢的時候,自動釋放

void  recev(char* buf, int bufsize){
            int size;
}

<2>堆區(qū)
一般由程序員分配釋放(動態(tài)內(nèi)存申請與釋放)嗦明,若程序員不釋放,程序結(jié)束時可能由操作系統(tǒng)回收蚪燕。
例如:下面的src所指向的內(nèi)存空間就是在堆區(qū)

char* src = (char*) malloc(sizeof(buf) * sizeof(10));

<3>全局去(靜態(tài)區(qū))
全局變量和靜態(tài)變量存放在此娶牌。里面細(xì)分有一個常量區(qū), 字符串常量和其他常量也存放在此. 該區(qū)域是在程序結(jié)束后由操作系統(tǒng)釋放奔浅。

<4> 程序代碼區(qū)
這個區(qū)域存放函數(shù)體的二進(jìn)制代碼.也是由操作系統(tǒng)進(jìn)行管理的

[3]劃分內(nèi)存四區(qū)的意義

  • C語言程序中,根據(jù)是局部變量,全局變量, 常量還是通過malloc等類似的函數(shù)分配內(nèi)存空間, 把他們放到對應(yīng)的內(nèi)存區(qū)中.這樣就賦予了這些變量或常量不同的生命周期, 不同的釋放方式. 根據(jù)我們程序的需要,我們在編碼過程中,聲明不同的變量類型, 使他們有不同的聲明長度, 不同的釋放方式,給我們更大的靈活編程

[4]內(nèi)存四區(qū)的一個示例

  • 四區(qū)代碼如下
    (1)棧區(qū)
    棧區(qū)的變量由編譯器自動分配釋放,存放函數(shù)的參數(shù)值诗良,局部變量等汹桦,函數(shù)推出后變量自動被釋放。下面的程序中鉴裹,getMem()在棧中分配了個數(shù)組變量buf舞骆,在main函數(shù)調(diào)用中將其賦值給temp,這里會使得程序出錯甚至崩潰径荔。原因在于getMem()退后后變量buf被釋放掉了督禽,temp指向了一個被釋放的內(nèi)存空間。
char *getMem()
{
    char buf[64]; //臨時變量 棧區(qū)存放
    strcpy(buf, "123456789");
    //printf("buf:%s\n", buf);
    return buf;
}

//main調(diào)用
void main()
{
    char *tmp = NULL;
    tmp = getMem(10);
    if (tmp == NULL)
    {
    return ;
     }     
}

(2)堆區(qū)
一般由程序員分配釋放(動態(tài)內(nèi)存申請與釋放)猖凛,若程序員不釋放赂蠢,程序結(jié)束時可能由操作系統(tǒng)回收。這里不會出現(xiàn)向棧的情況辨泳,原因在于堆中的內(nèi)存不會被自動釋放掉虱岂。

//堆
char *getMem(int num)
{
    char *p1 = NULL;
    p1 = (char *)malloc(sizeof(char) * num);
    if (p1 == NULL)
    {
        return NULL;
    }
    return p1;
}

(3)全局區(qū)
全局變量和靜態(tài)變量存放在此。該區(qū)域是在程序結(jié)束后由操作系統(tǒng)釋放菠红。

char *getStr()
{
    char *p = "abcdefg2";
    return p;
}

void main()
{
     char *p1 = NULL;
     p1 = getStr();
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末第岖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子试溯,更是在濱河造成了極大的恐慌蔑滓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遇绞,死亡現(xiàn)場離奇詭異键袱,居然都是意外死亡,警方通過查閱死者的電腦和手機摹闽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蹄咖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人付鹿,你說我怎么就攤上這事澜汤。” “怎么了舵匾?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵俊抵,是天一觀的道長。 經(jīng)常有香客問我坐梯,道長徽诲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谎替,結(jié)果婚禮上轩拨,老公的妹妹穿的比我還像新娘。我一直安慰自己院喜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布晕翠。 她就那樣靜靜地躺著喷舀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淋肾。 梳的紋絲不亂的頭發(fā)上硫麻,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音樊卓,去河邊找鬼拿愧。 笑死,一個胖子當(dāng)著我的面吹牛碌尔,可吹牛的內(nèi)容都是我干的浇辜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼唾戚,長吁一口氣:“原來是場噩夢啊……” “哼柳洋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叹坦,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熊镣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后募书,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绪囱,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年莹捡,在試婚紗的時候發(fā)現(xiàn)自己被綠了鬼吵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡道盏,死狀恐怖而柑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荷逞,我是刑警寧澤媒咳,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站种远,受9級特大地震影響涩澡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坠敷,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一妙同、第九天 我趴在偏房一處隱蔽的房頂上張望射富。 院中可真熱鬧,春花似錦粥帚、人聲如沸胰耗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柴灯。三九已至,卻和暖如春费尽,著一層夾襖步出監(jiān)牢的瞬間赠群,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工旱幼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留查描,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓柏卤,卻偏偏與公主長得像冬三,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闷旧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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