免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

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

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

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

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

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

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

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

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

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

下圖是APUE中的一個(gè)典型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****) ,

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

3 加載:

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

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

靜態(tài)分配

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

自動(dòng)分配

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

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

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

動(dòng)態(tài)分配

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

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

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

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

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

網(wǎng)頁名稱:c語言函數(shù)的內(nèi)存分布 c語言內(nèi)存分為幾個(gè)區(qū)
分享URL:http://m.newbst.com/article38/dogpspp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司微信小程序網(wǎng)站改版、軟件開發(fā)、網(wǎng)站設(shè)計(jì)公司關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)