c語言動(dòng)態(tài)管理函數(shù)講解 c語言中的動(dòng)態(tài)分配函數(shù)

C語言動(dòng)態(tài)內(nèi)存分配

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

創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司,提供做網(wǎng)站、成都做網(wǎng)站,網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

1、malloc函數(shù)

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

void *malloc (u igned int size)

其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長度為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)該檢測返回值是否為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)檢測返回值是否為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)難性的后果。

注意:這里重要的是指針的值,而不是用來申請動(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ù)是對存儲(chǔ)區(qū)域進(jìn)行分配的。

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

所以由這兩個(gè)函數(shù)就可以實(shí)現(xiàn)對內(nèi)存區(qū)域進(jìn)行動(dòng)態(tài)分配并進(jìn)行簡單的管理了。

希望能解決您的問題。

C語言中動(dòng)態(tài)內(nèi)存分配函數(shù)的用法及作用?(比如malloc,calloc,realloc等)

先舉個(gè)例子:某用戶需要一個(gè)將任意多個(gè)整數(shù)按大小排序的程序。(在計(jì)算機(jī)文件夾中,當(dāng)文件很多時(shí)經(jīng)常用到排序)

1。若不用動(dòng)態(tài)分配內(nèi)存,那就定義一個(gè)超大的數(shù)組吧!問題是,如果用戶不需要那么大,不就浪費(fèi)了?如果定義的數(shù)組還不夠大,不就不能滿足需求了?

2。如果用動(dòng)態(tài)分配,就解決上述問題了。當(dāng)你需要多大內(nèi)存時(shí),就給你多大——如果有的話——這就是動(dòng)態(tài)分配的意義。

現(xiàn)在看上述問題的代碼,我調(diào)試過的:

----------------------------------------------------------------------

#include stdio.h

#include stdlib.h /* calloc、exit需要聲明頭文件 */

void main()

{

int n,*p,i,j,m;

printf("本程序可對任意個(gè)整數(shù)排序;\n");

printf("請輸入整數(shù)的總個(gè)數(shù): ");

scanf("%d",n);

p=(int *)calloc(n,sizeof(int)); /* calloc函數(shù)的使用 */

if(p==0) {

printf("分配失敗!\n");

exit(1); /* 當(dāng)分配失敗時(shí),exit可以終止程序 */

}

printf("請輸入這些整數(shù):\n");

for(i=0;in;i++)

scanf("%d",p+i); /* 利用指針移位的方法賦值 */

for(i=1;in;i++) /* 冒泡排序法 */

{

for(j=0;jn-i;j++)

if(*(p+j)*(p+j+1))

{

m=*(p+j);

*(p+j)=*(p+j+1);

*(p+j+1)=m;

}

}

printf("將這些整數(shù)從小到大排列輸出為:");

for(i=0;in;i++)

{

if(i%5==0) printf("\n"); /* 每隔5個(gè)數(shù)換行 */

printf(" %11d;",*(p+i));

/* 為了整齊,每個(gè)數(shù)占11個(gè)字符,當(dāng)數(shù)字很多時(shí)這很重要 */

}

printf("\n");

free(p); /* 釋放空間 */

}

----------------------------------------------------------------------

調(diào)用calloc函數(shù)時(shí),calloc(n,sizeof(int))表示請求n個(gè)連續(xù)的、每個(gè)長度為整型的空間,若成功返回這些空間的首地址。(int *)表示將這個(gè)地址放在指針中。到此為止,就可以用指針來對分配到的空間操作了。注意,最后一定要用free函數(shù)釋放申請到的空間,否則這部分空間會(huì)一直占著。

malloc、calloc、realloc的用法(以上述問題為例)及區(qū)別:

1。malloc(n*sizeof(int)) /* 請求n個(gè)連續(xù)的、每個(gè)長度為整型的空間,若成功返回這些空間的首地址,失敗返回0 */

2。calloc(n,sizeof(int)) /* 請求n個(gè)連續(xù)的、每個(gè)長度為整型的空間,若成功返回這些空間的首地址并將每個(gè)空間賦值為0,失敗返回0 */

3。realloc(p,sizeof(int)*n) /* 給一個(gè)已經(jīng)分配了地址的指針重新分配空間,參數(shù)p為原有的空間地址,sizeof(int)*n是重新申請的地址長度,用于分配不足的時(shí)候。個(gè)人覺得沒用——不夠就找到原分配處改大一點(diǎn)不就行了?! */

我能說得只有這些了,有些東西看起來麻煩,當(dāng)你小試一下就會(huì)發(fā)現(xiàn),不過如此嘛!學(xué)C要多練、多思,不怕麻煩。不知道您學(xué)了遞歸沒有?有個(gè)經(jīng)典的“漢諾塔”問題,那家伙——得整死人?。〉浆F(xiàn)在我還一知半解的……

希望我的回答對您有幫助!

C語言怎么動(dòng)態(tài)創(chuàng)建函數(shù)?

C語言可以通過宏,在你需要的位置宏展開出一個(gè)新的函數(shù)。

例如:

#define XXX(funcname) \

int funcname (int arg1, int arg2) \

{ return arg1 + arg2; }

但這也是編譯期就決定好了的,也不能實(shí)現(xiàn)運(yùn)行期動(dòng)態(tài)創(chuàng)建。

C語言中的動(dòng)態(tài)存儲(chǔ)管理的命令的作用是什么?

malloc()是動(dòng)態(tài)內(nèi)存分配函數(shù),用來向系統(tǒng)請求分配內(nèi)存空間。當(dāng)無法知道內(nèi)存具體的位置時(shí),想要綁定真正的內(nèi)存空間,就要用到malloc()函數(shù)。因?yàn)閙alloc只分配內(nèi)存空間,并不能對分配的空間進(jìn)行初始化,所以申請到的內(nèi)存中的值是隨機(jī)的,經(jīng)常會(huì)使用memset()進(jìn)行置0操作后再使用。

什么是c語言里面的動(dòng)態(tài)存儲(chǔ)分配函數(shù)?。?/h2>

動(dòng)態(tài)內(nèi)存分配即分配內(nèi)存大小在運(yùn)行時(shí)才確定,一般在堆中分配。

C語言動(dòng)態(tài)內(nèi)存分配相關(guān)的函數(shù)如下幾個(gè):malloc、calloc、realloc、free;

malloc函數(shù)的使用比較直接,一個(gè)成功的malloc調(diào)用返回分配的size大小的內(nèi)存的指針。失敗時(shí)返回NULL并將錯(cuò)誤代碼置為ENOMEM。

calloc函數(shù)可以分配nr個(gè)size大小的內(nèi)存空間,一般用于一組struct結(jié)構(gòu)體的分配。

realloc函數(shù)將ptr指向的內(nèi)存空間重新分配大小為size并返回新的內(nèi)存首地址。

free函數(shù)釋放前三個(gè)函數(shù)申請的內(nèi)存空間,所以,使用前三個(gè)分配函數(shù)分配的內(nèi)存一定要free掉。

C語言中的動(dòng)態(tài)內(nèi)存分配的用法舉例

1、malloc函數(shù):其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長度為size的連續(xù)空間。其參數(shù)是一個(gè)無符號(hào)整形數(shù),返回值是一個(gè)指向所分配的連續(xù)存儲(chǔ)域的起始地址的指針。

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

3、calloc函數(shù):其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長度為 size 的連續(xù)空間。函數(shù)返回一個(gè)指向分配區(qū)域的起始位置的指針;如果分配不成功,則返回NULL。

擴(kuò)展資料:

函數(shù)運(yùn)算符:

new

運(yùn)算符new用于向系統(tǒng)申請動(dòng)態(tài)存儲(chǔ)空間,并把首地址作為運(yùn)算結(jié)果,它的使用形式為:

指針變量=new 數(shù)據(jù)類型;

例如:

int *p=new int

該語句的作用是會(huì)用new從內(nèi)存中申請了一個(gè)int型變量(4個(gè)字節(jié)),并將該變量的首地址賦給指針變量p。

new所建立的變量的初始值是任意的,也可在用new分配內(nèi)存的同時(shí)進(jìn)行初始化。使用形式為:

指針變量=new 數(shù)據(jù)類型(初始值)。

delete

堆內(nèi)存可按照要求進(jìn)行分配,程序?qū)?nèi)存的需求量隨時(shí)會(huì)發(fā)生變化,有時(shí)程序在運(yùn)行種可能會(huì)不再需要由new分配的內(nèi)存空間,而且程序還未運(yùn)行結(jié)束,這時(shí)就需要把先前占用的內(nèi)存空間釋放給堆內(nèi)存,以后重新分配,供程序的其他部分使用。運(yùn)算符delete用于釋放new分配的內(nèi)存空間,刪除建立的對象,它的使用形式為:

delete?指針變量;

其中的指針變量中保存著new分配的內(nèi)存的首地址。

參考資料:百度百科--動(dòng)態(tài)內(nèi)存分配

網(wǎng)站名稱:c語言動(dòng)態(tài)管理函數(shù)講解 c語言中的動(dòng)態(tài)分配函數(shù)
鏈接分享:http://www.muchs.cn/article6/hggiog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、面包屑導(dǎo)航、用戶體驗(yàn)自適應(yīng)網(wǎng)站、企業(yè)網(wǎng)站制作、標(biāo)簽優(yōu)化

廣告

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

成都網(wǎng)站建設(shè)