1、內存管理
我們需要知道——變量,其實是內存地址的一個抽像名字罷了。在靜態編譯的程序中,所有的變量名都會在編譯時被轉成內存地址。機器是不知道我們取的名字的,只知道地址。
內存的使用時程序設計中需要考慮的重要因素之一,這不僅由于系統內存是有限的(尤其在嵌入式系統中),而且內存分配也會直接影響到程序的效率。因此,我們要對C語言中的內存管理,有個系統的了解。
在C語言中,定義了4個內存區間:代碼區;全局變量和靜態變量區;局部變量區即棧區;動態存儲區,即堆區;具體如下:
1>棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
2>堆區(heap)— 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。
3>全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的 另一塊區域。 - 程序結束后由系統釋放。
4>常量區—常量字符串就是放在這里的。 程序結束后由系統釋放。
5>程序代碼區—存放函數體的二進制代碼。我們來看張圖:
圖1
首先我們要知道,源代碼編譯成程序,程序是放在硬盤上的,而非內存里!只有執行時才會被調用到內存中!我們來看看程序結構,ELF是是Linux的主要可執行文件格式。ELF文件由4部分組成,分別是ELF頭(ELF header)、程序頭表(Program header table)、節(Section)和節頭表(Section header table)。具體如下:
1>Program header描述的是一個段在文件中的位置、大小以及它被放進內存后所在的位置和大小。即要加載的信息;
2>Sections保存著object 文件的信息,從連接角度看:包括指令,數據,符號表,重定位信息等等。在圖中,我們可以看到Sections中包括:
text 文本結 存放指令;
rodata 數據結 readonly;
data 數據結 可讀可寫;
3>Section頭表(section header table)包含了描述文件sections的信息。每個section在這個表中有一個入口;每個入口給出了該section的名字,大小,等等信息。相當于 索引!
而程序被加載到內存里面,又是如何分布的呢?我們看看上圖中:
1正文和初始化的數據和未初始化的數據就是我們所說的數據段,正文即代碼段;
2>正文段上面是常量區,常量區上面是全局變量和靜態變量區,二者占據的就是初始化的數據和未初始化的數據那部分;
3>再上面就是堆,動態存儲區,這里是上增長;
4>堆上面是棧,存放的是局部變量,就是局部變量所在代碼塊執行完畢后,這塊內存會被釋放,這里棧區是下增長;
5>命令行參數就是001之類的,環境變量什么的前面的文章已經講過,有興趣的可以去看看。
我們知道,內存分為動態內存和靜態內存,我們先講靜態內存。
1.1靜態內存
存儲模型決定了一個變量的內存分配方式和訪問特性,在C語言中主要有三個維度來決定:存儲時期 、作用域 、鏈接。
1、存儲時期存儲時期:變量在內存中的保留時間(生命周期)存儲時期分為兩種情況,關鍵是看變量在程序執行過程中會不會被系統自動回收掉。
1) 靜態存儲時期 Static在程序執行過程中一旦分配就不會被自動回收。通常來說,任何不在函數級別代碼塊內定義的變量。無論是否在代碼塊內,只要采用static關鍵字修飾的變量。
2) 自動存儲時期 Automatic除了靜態存儲以外的變量都是自動存儲時期的,或者說只要是在代碼塊內定義的非static的變量,系統會肚臍自動非配和釋放內存;
2、作用域作用域:一個變量在定義該變量的自身文件中的可見性(訪問或者引用)在C語言中,一共有3中作用域:1) 代碼塊作用域在代碼塊中定義的變量都具有該代碼的作用域。從這個變量定義地方開始,到這個代碼塊結束,該變量是可見的;
2) 函數原型作用域出現在函數原型中的變量,都具有函數原型作用域,函數原型作用域從變量定義處一直到原型聲明的末尾。
3) 文件作用域一個在所有函數之外定義的變量具有文件作用域,具有文件作用域的變量從它的定義處到包含該定義的文件結尾處都是可見的;
3、鏈接鏈接:一個變量在組成程序的所有文件中的可見性(訪問或者引用);C語言中一共有三種不同的鏈接:1) 外部鏈接如果一個變量在組成一個程序的所有文件中的任何位置都可以被訪問,則稱該變量支持外部鏈接;
2) 內部鏈接如果一個變量只可以在定義其自身的文件中的任何位置被訪問,則稱該變量支持內部鏈接。
3) 空鏈接如果一個變量只是被定義其自身的當前代碼塊所私有,不能被程序的其他部分所訪問,則成該變量支持空鏈接
我們來看一個代碼示例:
#include
inta = 0;// 全局初始化區
char*p1;//全局未初始化區
intmain()
{
intb;//b在棧區
chars[] = "abc";//棧
char*p2; //p2在棧區
char*p3 = "123456";//123456 主站蜘蛛池模板: 性欧美xxxxporn| 三色午夜秀| yy4408午夜场理论片| 性刺激欧美三级在线现看中文| 麻豆免费版| 国产又黄又粗又爽又色的视频软件| japanesen女同| 在线欧美精品一区二区三区| 天天啪免费视频在线看| 嫩草影院在线观看精品视频| 后入到高潮免费观看| 大香伊蕉在人线国产97| 538prom国产在线视频一区| 亚洲va久久久久| 善良的小峓子2在钱中文版女主角 善良的小峓子2在钱免费中文字 | 国产福利一区二区精品| 99久久精品免费看国产一区二区三区 | 偷偷要色偷偷| 秋霞在线观看视频一区二区三区| 久热人人综合人人九九精品视频| 国产亚洲精品字幕在线观看| 成人中文字幕在线| a级毛片高清免费视频| 中文字幕高清在线中文字幕| 亚洲成人综合在线| 无码一区二区三区| 日韩内射美女人妻一区二区三区| 女人高潮久久久叫人喷水 | 天海翼精品久久中文字幕| 欧式午夜理伦三级在线观看| 蜜臀AV中文字幕熟女人妻| 久久99精品视频| 狠狠躁天天躁小说| 国产亚洲va在线电影| 国产精品日本无码久久一老A| 邓奴的视频IVK| 打开双腿狠狠蹂躏蜜桃臀| WWW亚洲精品久久久无码| CHINA末成年VIDEO学生| 99热热在线精品久久| 97蜜桃网123|