亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > C語言內(nèi)存分配-通俗理解

C語言內(nèi)存分配-通俗理解 時間:2018-09-26      來源:未知

近很多同學希望了解C語言的內(nèi)存分配,雖然可以在互聯(lián)網(wǎng)上找到諸多的講解,但是你會發(fā)現(xiàn)要么不通俗易懂,要么不算太全面。而這些對于新手而言,又絕對會把你弄得暈頭轉(zhuǎn)向的,所以在此對網(wǎng)上和書本上的諸般講解,進行了通俗的翻譯和總結(jié)。

在說內(nèi)存分配之前,先提一點題外話,因為在和同學們講解內(nèi)存分配的時候,他們不是很明白為什么要進行這樣的分配。所以先講解下,計算機的組成和基本原理。

一、計算機的組成

計算機的五大組成部分:運算器、控制器、存儲器、輸入設(shè)備和輸出設(shè)備。

我們都知道計算機的處理中心是CPU,它主要由運算器和控制器組成。

1) 運算器

實現(xiàn)算術(shù)運算和邏輯運算的部分,主要對數(shù)據(jù)進行加工處理。

2) 控制器

計算機的指揮中心,它通過地址訪問存儲器,從存儲器中取出指令(程序),并指出下一指令在存儲器中的位置,將取出的指令經(jīng)指令寄存器送往指令譯碼器,經(jīng)過對指令的分析產(chǎn)生相應的操作,控制其他部件的有條不紊的工作。

控制器的組成框圖

執(zhí)行指令有四個步驟:取指令、指令譯碼、按指令操作碼執(zhí)行、形成下一條指令地址。

3)存儲器

計算機存放所有數(shù)據(jù)和程序的記憶部分,它分為兩大類:一類是內(nèi)部存儲器(內(nèi)存),一類是外部存儲器(外存)。存儲器由若干個存儲單元組成,每個存儲單元都有一個地址,計算機通過地址對存儲單元進行讀寫。

4) 輸入設(shè)備

向計算機輸入信息(程序、數(shù)據(jù)、聲音、文字、圖形、圖像等)的設(shè)備(鍵盤、鼠標、圖形掃描儀、觸摸屏、條形碼輸入器、光筆等)。

5) 輸出設(shè)備

主要有顯示器、打印機和繪圖儀等。

二、內(nèi)存分配

在任何程序設(shè)計環(huán)境及語言中,內(nèi)存管理都十分重要。在目前的計算機系統(tǒng)或嵌入式系統(tǒng)中,內(nèi)存資源仍然是有限的。因此在程序設(shè)計中,有效地管理內(nèi)存資源是程序員首先考慮的問題

1) C程序結(jié)構(gòu):可執(zhí)行代碼存儲時

下面是C語言可執(zhí)行程序的基本情況:

上面分別是:代碼區(qū)、全局初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)、未初始化數(shù)據(jù)區(qū)、十進制總和、十六進制總和、文件名。

我們可以看出程序在未運行前,沒有調(diào)入到內(nèi)存時,分為三個部分:代碼區(qū)(text)、數(shù)據(jù)區(qū)(data)、未初始化數(shù)據(jù)區(qū)(bss)。

(1) 代碼區(qū)(text)

存放CPU可執(zhí)行的機器指令,由于程序被經(jīng)常使用,防止其被意外修改,代碼區(qū)通常是只讀的。

(2) 全局初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)(data)

存放被初始化的全局變量、靜態(tài)變量(全局靜態(tài)變量和局部靜態(tài)變量)、常量數(shù)據(jù)(如字符串常量)。

(3) 未初始化數(shù)據(jù)區(qū)(BSS)

存放未初始化的全局變量,BSS這個叫法是根據(jù)早期的匯編運算符而來的,這個匯編運算符標志著一個塊的開始。BSS區(qū)的數(shù)據(jù)在程序開始執(zhí)行之前被內(nèi)核初始化為0或空指針(NULL)。

2)C程序結(jié)構(gòu):程序執(zhí)行時

一個正在運行的C程序,占用的內(nèi)存分為5個區(qū)域:代碼區(qū)、初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)、未初始化數(shù)據(jù)區(qū)、堆區(qū)、棧區(qū)。

程序運行時內(nèi)存區(qū)域

(1) 代碼區(qū)(text)

代碼區(qū)指令根據(jù)程序設(shè)計流程依次執(zhí)行,對于順序指令,則只會執(zhí)行一次,如果反復,則需使用跳轉(zhuǎn)指令,如果進行遞歸,則需借助棧來實現(xiàn)。

代碼區(qū)包括操作碼和要操作的對象(或?qū)ο蟮牡刂芬?,如果是立即數(shù)(即具體的數(shù)值,如2),將直接包含在代碼中;如果是局部數(shù)據(jù),將在棧中分配空間,然后引用該數(shù)據(jù)的地址;如果是BSS區(qū)和數(shù)據(jù)區(qū),在代碼中同樣引用該數(shù)據(jù)的地址。

(2) 全局初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)(data)

只初始化一次。上面已經(jīng)說過,在程序編譯時,該區(qū)域已經(jīng)被分配好了,這塊內(nèi)存在程序的整個運行期間都存在,當程序結(jié)束時,才會被釋放。

(3)未初始化數(shù)據(jù) 區(qū)(BSS)

在運行時改變其值。

(4)棧區(qū)(stack)

存放函數(shù)的參數(shù)值和局部變量,由編譯器自動分配釋放,其操作方式類似于數(shù)據(jù)結(jié)構(gòu)的棧。其特點是不需要程序員去考慮內(nèi)存管理的問題,很方便;同時棧的容量很有限,在Linux系統(tǒng)中,棧的容量只有8M,并且當相應的范圍結(jié)束時(如函數(shù)),局部變量就不能再使用。

(5)堆區(qū)(heap)

有些操作對象只有在程序運行時才能確定,這樣編譯器在編譯時就無法為他們預先分配空間,只有程序運行時才分配,這就是動態(tài)內(nèi)存分配。堆區(qū)就是用于動態(tài)內(nèi)存分配(如malloc的動態(tài)內(nèi)存分配),堆在內(nèi)存中位于bss區(qū)和棧區(qū)之間,一般由程序員申請和釋放。

之所以分配如此多的區(qū)域,主要是因為:

一個進程在運行時,代碼是根據(jù)流程依次執(zhí)行的,代碼只需訪問一次,當然跳轉(zhuǎn)或遞歸時代碼會被執(zhí)行多次,而數(shù)據(jù)一般都需要訪問多次,因此單獨開辟空間以便訪問和節(jié)約空間。

下面是一個詳細的代碼,來全面分析內(nèi)存分配情況:

//main.c

int a = 0; //a在全局初始化數(shù)據(jù)區(qū)

char *p1; //p1在bss區(qū)(未初始化全局變量)

static int c = 0; //c在全局初始化數(shù)據(jù)區(qū)(c是全局靜態(tài)變量)

struct employee

{

char name[20];

int age;

float score;

}e1; //e1在全局初始化數(shù)據(jù)區(qū)

int main()

{

int b; //b在棧區(qū)(局部變量)

char s[] = “abc”; //s在棧區(qū),“abc”在常量區(qū)(全局初始化數(shù)據(jù)區(qū))

char *p2; //p2在棧區(qū)

char *p3 = “123456”; //p3在棧區(qū),“123456”在常量區(qū)(全局初始化數(shù)據(jù)區(qū))

static int d = 0; //d在全局初始化數(shù)據(jù)區(qū)(靜態(tài)局部變量)

struct student

{

char *name; //name在棧區(qū),name指針指向是在堆區(qū)

int age;

float score;

}s1; //s1在棧區(qū)

p1 = (char*)malloc(10); //分配得來的10個字節(jié)的區(qū)域在堆區(qū)

p2 = (char*)malloc(20); //分配得來的20個字節(jié)的區(qū)域在堆區(qū)

name = (cahr *)malloc(20); //分配得來的20個字節(jié)的區(qū)域在堆區(qū)

/*從常量區(qū)的“Hello World”字符串復制到剛分配到的堆區(qū)*/

strcpy(p1, “Hello World”);

free(p1); //釋放內(nèi)存

free(p2); //釋放內(nèi)存

}

上一篇:STM32F030 Nucleo-開發(fā)前要做的事

下一篇:函數(shù)指針和指針函數(shù)

熱點文章推薦
華清學員就業(yè)榜單
高薪學員經(jīng)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權(quán)所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 国产三级日本三级日产三级66 | 永久免费人成网ww555kkk手机 | 免费毛片a | 二区三区在线观看 | 久草综合在线 | 久久影片| aaa在线观看高清免费 | 久久中文网中文字幕 | 精品特级毛片 | 美女天天色 | 成年人色网站 | 日本不卡视频在线 | 日韩aⅴ片| 免费看av在线网站网址 | 国产精品久久久久久久久久妇女 | 国产成人综合洲欧美在线 | 欧美一区亚洲二区 | 男人天堂日韩 | 国产成人高清在线观看播放 | 日本精品久久久久中文字幕 | 欧美1卡一卡二卡三新区 | 欧美日韩激情视频 | 国产精品资源在线观看网站 | 久草免费福利资源 | 久久99精品久久久久久欧洲站 | 精品视频一区二区三区 | 午夜免费观看福利片一区二区三区 | 免费a级特黄国产大片 | 97碰视频 | 中文字幕一区二区在线播放 | 精品一区二区三区18 | 久久久久久国产a免费观看黄色大片 | 巨熟乳波霸中文观看免费 | 久久精品国产亚洲高清 | 大尺度一级毛片波多野结衣 | 激情丁香网 | 日韩视频一区二区三区 | 久久99国产一区二区三区 | 亚洲午夜在线观看 | 久久中文字幕视频 | 男女激情在线观看 |