C語(yǔ)言中malloc是動(dòng)態(tài)內(nèi)存分配函數(shù)。

創(chuàng)新互聯(lián)公司于2013年開始,先為安仁等服務(wù)建站,安仁等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為安仁企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
函數(shù)原型:void *malloc(unsigned int num_bytes);
參數(shù):num_bytes 是無(wú)符號(hào)整型,用于表示分配的字節(jié)數(shù)。
返回值:如果分配成功則返回指向被分配內(nèi)存的指針(此存儲(chǔ)區(qū)中的初始值不確定),否則返回空指針NULL。void* 表示未確定類型的指針,void *可以指向任何類型的數(shù)據(jù),更明確的說(shuō)是指申請(qǐng)內(nèi)存空間時(shí)還不知道用戶是用這段空間來(lái)存儲(chǔ)什么類型的數(shù)據(jù)(比如是char還是int或者...)
功能:分配長(zhǎng)度為num_bytes字節(jié)的內(nèi)存塊
注意:當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。函數(shù)返回的指針一定要適當(dāng)對(duì)齊,使其可以用于任何數(shù)據(jù)對(duì)象。關(guān)于該函數(shù)的原型,在以前malloc返回的是char型指針,新的ANSIC標(biāo)準(zhǔn)規(guī)定,該函數(shù)返回為void型指針,因此必要時(shí)要進(jìn)行類型轉(zhuǎn)換。
實(shí)例:
#include"stdio.h"
#include"malloc.h"http://malloc()函數(shù)被包含在malloc.h里面
int main(void)
{
char*a=NULL;//聲明一個(gè)指向a的char*類型的指針
a=(char*)malloc(100*sizeof(char));//使用malloc分配內(nèi)存的首地址,然后賦值給a
if(!a)//如果malloc失敗,可以得到一些log
{
perror("malloc");
return-1;
}
sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"寫入a指向的地址
printf("%s\n",a);//輸出用戶輸入的數(shù)據(jù)
free(a);//釋放掉使用的內(nèi)存地址
return0;//例2有無(wú)內(nèi)存泄露?
}
C語(yǔ)言中malloc是動(dòng)態(tài)內(nèi)存分配函數(shù)。
函數(shù)原型:void *malloc(unsigned int num_bytes)。
參數(shù):num_bytes 是無(wú)符號(hào)整型,用于表示分配的字節(jié)數(shù)。
注意:當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。函數(shù)返回的指針一定要適當(dāng)對(duì)齊,使其可以用于任何數(shù)據(jù)對(duì)象。關(guān)于該函數(shù)的原型,在以前malloc返回的是char型指針,新的ANSIC標(biāo)準(zhǔn)規(guī)定,該函數(shù)返回為void型指針,因此必要時(shí)要進(jìn)行類型轉(zhuǎn)換。
實(shí)現(xiàn)malloc的方法:
首先我們要確定所采用的數(shù)據(jù)結(jié)構(gòu)。一個(gè)簡(jiǎn)單可行方案是將堆內(nèi)存空間以塊的形式組織起來(lái),每個(gè)塊由meta區(qū)和數(shù)據(jù)區(qū)組成,meta區(qū)記錄數(shù)據(jù)塊的元信息(數(shù)據(jù)區(qū)大小、空閑標(biāo)志位、指針等等)。
數(shù)據(jù)區(qū)是真實(shí)分配的內(nèi)存區(qū)域,并且數(shù)據(jù)區(qū)的第一個(gè)字節(jié)地址即為malloc返回的地址 。
函數(shù)的相對(duì)地址在編譯鏈接的時(shí)候就已經(jīng)分配好了,但是絕對(duì)地址是未知的。就是說(shuō),函數(shù)的地址相對(duì)于程序基址的偏移是確定的,但是程序在運(yùn)行的時(shí)候,會(huì)被加載到哪一個(gè)區(qū)域運(yùn)行是不確定的,需要由操作系統(tǒng)根據(jù)內(nèi)存的使用的情況等進(jìn)行調(diào)度,所以函數(shù)在內(nèi)存中的絕對(duì)地址也就自然不確定了,希望可以幫到你。
要實(shí)現(xiàn)根據(jù)程序的需要?jiǎng)討B(tài)分配存儲(chǔ)空間,就必須用到以下幾個(gè)函數(shù)
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è)無(wú)符號(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)語(yǔ)句可以分為以下幾步:
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)難性的后果。
注意:這里重要的是指針的值,而不是用來(lá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)單的管理了。
希望能解決您的問(wèn)題。
動(dòng)態(tài)內(nèi)存分配即分配內(nèi)存大小在運(yùn)行時(shí)才確定,一般在堆中分配。
C語(yǔ)言動(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ù)申請(qǐng)的內(nèi)存空間,所以,使用前三個(gè)分配函數(shù)分配的內(nèi)存一定要free掉。
先舉個(gè)例子:某用戶需要一個(gè)將任意多個(gè)整數(shù)按大小排序的程序。(在計(jì)算機(jī)文件夾中,當(dāng)文件很多時(shí)經(jīng)常用到排序)
1。若不用動(dòng)態(tài)分配內(nèi)存,那就定義一個(gè)超大的數(shù)組吧!問(wèn)題是,如果用戶不需要那么大,不就浪費(fèi)了?如果定義的數(shù)組還不夠大,不就不能滿足需求了?
2。如果用動(dòng)態(tài)分配,就解決上述問(wèn)題了。當(dāng)你需要多大內(nèi)存時(shí),就給你多大——如果有的話——這就是動(dòng)態(tài)分配的意義。
現(xiàn)在看上述問(wèn)題的代碼,我調(diào)試過(guò)的:
----------------------------------------------------------------------
#include stdio.h
#include stdlib.h /* calloc、exit需要聲明頭文件 */
void main()
{
int n,*p,i,j,m;
printf("本程序可對(duì)任意個(gè)整數(shù)排序;\n");
printf("請(qǐng)輸入整數(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("請(qǐng)輸入這些整數(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))表示請(qǐng)求n個(gè)連續(xù)的、每個(gè)長(zhǎng)度為整型的空間,若成功返回這些空間的首地址。(int *)表示將這個(gè)地址放在指針中。到此為止,就可以用指針來(lái)對(duì)分配到的空間操作了。注意,最后一定要用free函數(shù)釋放申請(qǐng)到的空間,否則這部分空間會(huì)一直占著。
malloc、calloc、realloc的用法(以上述問(wèn)題為例)及區(qū)別:
1。malloc(n*sizeof(int)) /* 請(qǐng)求n個(gè)連續(xù)的、每個(gè)長(zhǎng)度為整型的空間,若成功返回這些空間的首地址,失敗返回0 */
2。calloc(n,sizeof(int)) /* 請(qǐng)求n個(gè)連續(xù)的、每個(gè)長(zhǎng)度為整型的空間,若成功返回這些空間的首地址并將每個(gè)空間賦值為0,失敗返回0 */
3。realloc(p,sizeof(int)*n) /* 給一個(gè)已經(jīng)分配了地址的指針重新分配空間,參數(shù)p為原有的空間地址,sizeof(int)*n是重新申請(qǐng)的地址長(zhǎng)度,用于分配不足的時(shí)候。個(gè)人覺得沒(méi)用——不夠就找到原分配處改大一點(diǎn)不就行了?! */
我能說(shuō)得只有這些了,有些東西看起來(lái)麻煩,當(dāng)你小試一下就會(huì)發(fā)現(xiàn),不過(guò)如此嘛!學(xué)C要多練、多思,不怕麻煩。不知道您學(xué)了遞歸沒(méi)有?有個(gè)經(jīng)典的“漢諾塔”問(wèn)題,那家伙——得整死人啊!到現(xiàn)在我還一知半解的……
希望我的回答對(duì)您有幫助!
分享名稱:c語(yǔ)言內(nèi)存分配使用函數(shù) c語(yǔ)言分配內(nèi)存的方式
文章起源:http://chinadenli.net/article42/hijohc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)、商城網(wǎng)站、電子商務(wù)、小程序開發(fā)、用戶體驗(yàn)
聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)