位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C語(yǔ)言 > 問(wèn)題詳情

C語(yǔ)言 malloc()函數(shù)

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-03

malloc()函數(shù)原型如下:

    void *malloc(int size);

malloc()向系統(tǒng)申請(qǐng)分配指定size個(gè)字節(jié)的內(nèi)存空間。返回類(lèi)型是void*類(lèi)型。void*表示未確定類(lèi)型的指針。void1*類(lèi)型可以強(qiáng)制轉(zhuǎn)換為任何其他類(lèi)型的指針。

從函數(shù)聲明上可以看出。malloc()和new()至少有兩個(gè)不同:

(1)new()返回指定類(lèi)型的指針,且可以自動(dòng)計(jì)算所需要大小。比如:

int *p;

var cpro_psid ="u2572954";

var cpro_pswidth =966; 

var cpro_psheig =120;

p = new int;     //返回類(lèi)型為int*類(lèi)型(整數(shù)型指針),分配大小為

sizeof(int);    或:   int* parr;

parr = new int [100]; //返回類(lèi)型為int*類(lèi)型(整數(shù)型指針),分配大小為

sizeof(iirt) * 100;

(2)mallocO則必須計(jì)算宇節(jié)數(shù),并且在返回后強(qiáng)行轉(zhuǎn)換為實(shí)際類(lèi)型的指針。

    int* p;

    p = (int *) mallocr (sizeof(int));

malloc函數(shù)返回的是void*類(lèi)型,如果寫(xiě)成如下格式:

    p = malloc (sizeof(int));

程序無(wú)法通過(guò)編譯,且報(bào)如下錯(cuò)誤:“不能將void*賦值給int*類(lèi)型變量”。所以必須通過(guò)(int *)來(lái)將強(qiáng)制轉(zhuǎn)換。

函數(shù)的實(shí)參為sizeof(int),用于指明一個(gè)整型數(shù)據(jù)需要的大小。如果寫(xiě)成如下格式:

    int* p = (int *) malloc (1);

代碼也能通過(guò)編譯,但只分配了1個(gè)字節(jié)的內(nèi)存空間,當(dāng)存入一個(gè)整數(shù),就會(huì)有3個(gè)字節(jié)無(wú)家可歸,而直接“住進(jìn)鄰居家”!這會(huì)導(dǎo)致后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。mallocO也可以達(dá)到new[]的效果,申請(qǐng)出一段連續(xù)的內(nèi)存,方法無(wú)非是指定所需內(nèi)存大小。比如想分配100個(gè)int類(lèi)型的空間:

    int* p =(int *)malloc(sizeof(int)*100);  //分配可以放得下100個(gè)聲敎的內(nèi).存空間

另外有一點(diǎn)無(wú)法直接看出的區(qū)別是,malloc()只管分配內(nèi)存,并不能對(duì)所得的內(nèi)存進(jìn)行初始化,所以得到的一片新內(nèi)存中,其值將是隨機(jī)的。

除了分配及最后釋放的方法不一樣以外,通過(guò)mallocO或new()得到指針,在其他操作上保持一致。malloc()函數(shù)其實(shí)就是在內(nèi)存中找一片指定大小的空間,然后將這個(gè)空間的首地址范圍給一個(gè)指針變量。這里的指針變量可以是一個(gè)單獨(dú)的指針,也可以是一個(gè)數(shù)組的首地址。這取決于malloc()函數(shù)中參數(shù)size的具體內(nèi)容。這里mallocO分配的內(nèi)存空間在邏輯是連續(xù)的,而在物理上可以連續(xù)也可以不連續(xù)。對(duì)于程序員來(lái)說(shuō),關(guān)注的是邏輯上的連續(xù),因?yàn)椴僮飨到y(tǒng)會(huì)幫助安排內(nèi)存分配,所以使用起來(lái)就可以當(dāng)作是連續(xù)的。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部