真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語言函數(shù)的內(nèi)存分布 c語言內(nèi)存分為幾個區(qū)

C語言問題:內(nèi)存的分配方式有哪幾種?

內(nèi)存分配方式有三種:

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出吉木乃免費做網(wǎng)站回饋大家。

[1]從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在。例如全局變量,static變量。

[2]在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。

[3]從堆上分配,亦稱動態(tài)內(nèi)存分配。程序在運行的時候用malloc或new申請任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時用free或delete釋放內(nèi)存。動態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責(zé)任回收它,否則運行的程序會出現(xiàn)內(nèi)存泄漏,頻繁地分配和釋放不同大小的堆空間將會產(chǎn)生堆內(nèi)碎塊。

C語言中內(nèi)存分布及程序運行加載過程

一個程序內(nèi)存分配:

下圖是APUE中的一個典型C內(nèi)存空間分布圖(虛擬內(nèi)存)

例如:

int g1=0, g2=0, g3=0;

int max(int i)

{

int m1=0,m2,m3=0, p_max;

static n1_max=0,n2_max,n3_max=0;

p_max = (int )malloc(10);

printf("打印max程序地址\n");

printf("in max: 0xx\n\n",max);

printf("打印max傳入?yún)?shù)地址\n");

printf("in max: 0xx\n\n",i);

printf("打印max函數(shù)中靜態(tài)變量地址\n");

printf("0xx\n",n1_max); //打印各本地變量的內(nèi)存地址

printf("0xx\n",n2_max);

printf("0xx\n\n",n3_max);

printf("打印max函數(shù)中局部變量地址\n");

printf("0xx\n",m1); //打印各本地變量的內(nèi)存地址

printf("0xx\n",m2);

printf("0xx\n\n",m3);

printf("打印max函數(shù)中malloc分配地址\n");

printf("0xx\n\n",p_max); //打印各本地變量的內(nèi)存地址

if(i) return 1;

else return 0;

}

int main(int argc, char **argv)

{

static int s1=0, s2, s3=0;

int v1=0, v2, v3=0;

int p;

p = (int )malloc(10);

printf("打印各全局變量(已初始化)的內(nèi)存地址\n");

printf("0xx\n",g1); //打印各全局變量的內(nèi)存地址

printf("0xx\n",g2);

printf("0xx\n\n",g3);

printf("======================\n");

printf("打印程序初始程序main地址\n");

printf("main: 0xx\n\n", main);

printf("打印主參地址\n");

printf("argv: 0xx\n\n",argv);

printf("打印各靜態(tài)變量的內(nèi)存地址\n");

printf("0xx\n",s1); //打印各靜態(tài)變量的內(nèi)存地址

printf("0xx\n",s2);

printf("0xx\n\n",s3);

printf("打印各局部變量的內(nèi)存地址\n");

printf("0xx\n",v1); //打印各本地變量的內(nèi)存地址

printf("0xx\n",v2);

printf("0xx\n\n",v3);

printf("打印malloc分配的堆地址\n");

printf("malloc: 0xx\n\n",p);

printf("======================\n");

max(v1);

printf("======================\n");

printf("打印子函數(shù)起始地址\n");

printf("max: 0xx\n\n",max);

return 0;

}

打印結(jié)果:

ELF目標(biāo)文件格式的最前端是 ELF****文件頭(****ELF Header****) ,

包含了描述整個文件的基本屬性,如ELF版本、目標(biāo)機(jī)器型號、 程序入口地址 等

3 加載:

c語言內(nèi)存有幾種分配方式?

基本上C程序的元素存儲在內(nèi)存的時候有3種分配策略:

靜態(tài)分配

如果一個變量聲明為全局變量或者是函數(shù)的靜態(tài)變量,這個變量的存儲將使用靜態(tài)分配方式。靜態(tài)分配的內(nèi)存一般會被編譯器放在數(shù)據(jù)段或代碼段來存儲,具體取決于實現(xiàn)。這樣做的前提是,在編譯時就必須確定變量的大小。 以IA32的x86平臺及gcc編譯器為例,全局及靜態(tài)變量放在數(shù)據(jù)段的低端;全局及靜態(tài)常量放在代碼段的高端

自動分配

函數(shù)的自動局部變量應(yīng)該隨著函數(shù)的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比于靜態(tài)分配,這時候,就不必絕對要求這個變量在編譯時就必須確定變量的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放松了這個限制。但無論是C89還是C99,都不允許一個已經(jīng)分配的自動變量運行時改變大小。

所以說C函數(shù)永遠(yuǎn)不應(yīng)該返回一個局部變量的地址。

要指出的是,自動分配也屬于動態(tài)分配,甚至可以用alloca函數(shù)來像分配堆(Heap)一樣進(jìn)行分配,而且釋放是自動的。

動態(tài)分配

還有一種更加特殊的情況,變量的大小在運行時有可能改變,或者雖然單個變量大小不變,變量的數(shù)目卻有很大彈性,不能靜態(tài)分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數(shù)是malloc、calloc、realloc和free。

使用堆(Heap)內(nèi)存將帶來額外的開銷和風(fēng)險。

在C語言中,如何給函數(shù)分配內(nèi)存?

不知lz有沒聽說過虛存一說,當(dāng)源碼被編譯成二進(jìn)制文件后,其中的變量,函數(shù)的虛擬地址,也就是內(nèi)存空間中的地址就已確定,在運行時,操作系統(tǒng)為其分配物理內(nèi)存并添加虛擬地址到物理地址的映射。

再說的多一點,一個進(jìn)程(運行的程序)可分為若干段:代碼段、數(shù)據(jù)段、堆棧段等,其中函數(shù)所操作的空間(也就是局部變量的空間)就位于堆棧段,所謂函數(shù)分配內(nèi)存大小,實際就是堆棧段指針的變化而已。


當(dāng)前標(biāo)題:c語言函數(shù)的內(nèi)存分布 c語言內(nèi)存分為幾個區(qū)
瀏覽路徑:http://weahome.cn/article/dogpspp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部