C語言 malloc()函數(shù)
malloc()函數(shù)原型如下:
void *malloc(int size);
malloc()向系統(tǒng)申請分配指定size個字節(jié)的內(nèi)存空間。返回類型是void*類型。void*表示未確定類型的指針。void1*類型可以強制轉(zhuǎn)換為任何其他類型的指針。
從函數(shù)聲明上可以看出。malloc()和new()至少有兩個不同:
(1)new()返回指定類型的指針,且可以自動計算所需要大小。比如:
int *p;
var cpro_psid ="u2572954";
var cpro_pswidth =966;
var cpro_psheig =120;
p = new int; //返回類型為int*類型(整數(shù)型指針),分配大小為
sizeof(int); 或: int* parr;
parr = new int [100]; //返回類型為int*類型(整數(shù)型指針),分配大小為
sizeof(iirt) * 100;
(2)mallocO則必須計算宇節(jié)數(shù),并且在返回后強行轉(zhuǎn)換為實際類型的指針。
int* p;
p = (int *) mallocr (sizeof(int));
malloc函數(shù)返回的是void*類型,如果寫成如下格式:
p = malloc (sizeof(int));
程序無法通過編譯,且報如下錯誤:“不能將void*賦值給int*類型變量”。所以必須通過(int *)來將強制轉(zhuǎn)換。
函數(shù)的實參為sizeof(int),用于指明一個整型數(shù)據(jù)需要的大小。如果寫成如下格式:
int* p = (int *) malloc (1);
代碼也能通過編譯,但只分配了1個字節(jié)的內(nèi)存空間,當存入一個整數(shù),就會有3個字節(jié)無家可歸,而直接“住進鄰居家”!這會導致后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。mallocO也可以達到new[]的效果,申請出一段連續(xù)的內(nèi)存,方法無非是指定所需內(nèi)存大小。比如想分配100個int類型的空間:
int* p =(int *)malloc(sizeof(int)*100); //分配可以放得下100個聲敎的內(nèi).存空間
另外有一點無法直接看出的區(qū)別是,malloc()只管分配內(nèi)存,并不能對所得的內(nèi)存進行初始化,所以得到的一片新內(nèi)存中,其值將是隨機的。
除了分配及最后釋放的方法不一樣以外,通過mallocO或new()得到指針,在其他操作上保持一致。malloc()函數(shù)其實就是在內(nèi)存中找一片指定大小的空間,然后將這個空間的首地址范圍給一個指針變量。這里的指針變量可以是一個單獨的指針,也可以是一個數(shù)組的首地址。這取決于malloc()函數(shù)中參數(shù)size的具體內(nèi)容。這里mallocO分配的內(nèi)存空間在邏輯是連續(xù)的,而在物理上可以連續(xù)也可以不連續(xù)。對于程序員來說,關(guān)注的是邏輯上的連續(xù),因為操作系統(tǒng)會幫助安排內(nèi)存分配,所以使用起來就可以當作是連續(xù)的。
點擊加載更多評論>>