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

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

c語言中函數(shù)的內(nèi)存分配 c++中內(nèi)存分配方式

C語言中分配內(nèi)存

要實(shí)現(xiàn)根據(jù)程序的需要?jiǎng)討B(tài)分配存儲(chǔ)空間,就必須用到以下幾個(gè)函數(shù)

創(chuàng)新互聯(lián)主營(yíng)良慶網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件定制開發(fā),良慶h5成都小程序開發(fā)搭建,良慶網(wǎng)站營(yíng)銷推廣歡迎良慶等地區(qū)企業(yè)咨詢

1、malloc函數(shù)

malloc函數(shù)的原型為:

void

*malloc

(u

igned

int

size)

其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。其參數(shù)是一個(gè)無符號(hào)整形數(shù),返回值是一個(gè)指向所分配的連續(xù)存儲(chǔ)域的起始地址的指針。還有一點(diǎn)必須注意的是,當(dāng)函數(shù)未能成功分配存儲(chǔ)空間(如內(nèi)存不足)就會(huì)返回一個(gè)NULL指針。所以在調(diào)用該函數(shù)時(shí)應(yīng)該檢測(cè)返回值是否為NULL并執(zhí)行相應(yīng)的操作。

下例是一個(gè)動(dòng)態(tài)分配的程序:

#include

#include

main()

{

int

count,*array;

/*count是一個(gè)計(jì)數(shù)器,array是一個(gè)整型指針,也可以理解為指向一個(gè)整型數(shù)組的首地址*/

if((array(int

*)

malloc(10*sizeof(int)))==NULL)

{

printf("不能成功分配存儲(chǔ)空間。");

exit(1);

}

for

(count=0;count〈10;count++)

/*給數(shù)組賦值*/

array[count]=count;

for(count=0;count〈10;count++)

/*打印數(shù)組元素*/

printf("%2d",array[count]);

}

上例中動(dòng)態(tài)分配了10個(gè)整型存儲(chǔ)區(qū)域,然后進(jìn)行賦值并打印。例中if((array(int

*)

malloc(10*sizeof(int)))==NULL)語句可以分為以下幾步:

1)分配10個(gè)整型的連續(xù)存儲(chǔ)空間,并返回一個(gè)指向其起始地址的整型指針

2)把此整型指針地址賦給array

3)檢測(cè)返回值是否為NULL

2、free函數(shù)

由于內(nèi)存區(qū)域總是有限的,不能不限制地分配下去,而且一個(gè)程序要盡量節(jié)省資源,所以當(dāng)所分配的內(nèi)存區(qū)域不用時(shí),就要釋放它,以便其它的變量或者程序使用。這時(shí)我們就要用到free函數(shù)。

其函數(shù)原型是:

void

free(void

*p)

作用是釋放指針p所指向的內(nèi)存區(qū)。

其參數(shù)p必須是先前調(diào)用malloc函數(shù)或calloc函數(shù)(另一個(gè)動(dòng)態(tài)分配存儲(chǔ)區(qū)域的函數(shù))時(shí)返回的指針。給free函數(shù)傳遞其它的值很可能造成死機(jī)或其它災(zāi)難性的后果。

注意:這里重要的是指針的值,而不是用來申請(qǐng)動(dòng)態(tài)內(nèi)存的指針本身。例:

int

*p1,*p2;

p1=malloc(10*sizeof(int));

p2=p1;

……

free(p2)

/*或者free(p2)*/

malloc返回值賦給p1,又把p1的值賦給p2,所以此時(shí)p1,p2都可作為free函數(shù)的參數(shù)。

malloc函數(shù)是對(duì)存儲(chǔ)區(qū)域進(jìn)行分配的。

free函數(shù)是釋放已經(jīng)不用的內(nèi)存區(qū)域的。

所以由這兩個(gè)函數(shù)就可以實(shí)現(xiàn)對(duì)內(nèi)存區(qū)域進(jìn)行動(dòng)態(tài)分配并進(jìn)行簡(jiǎ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í)際就是堆棧段指針的變化而已。

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)。


當(dāng)前題目:c語言中函數(shù)的內(nèi)存分配 c++中內(nèi)存分配方式
文章來源:http://weahome.cn/article/hhpcih.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部