需要包含頭檔:
#i nclude
或
#i nclude
函數宣告(函數原型):
void *malloc(int size);
malloc函數用於向系統申請分配指定大小的記憶體空間,傳回類型為void*。在C和C 中,void*類型的指標可以強制轉換為任何其他類型的指標。
從函數宣告上可以看出,malloc 和 new 至少有兩個不同之處:new 傳回指定類型的指針,並且可以自動計算所需的大小。例如:
int *p;
p = new int; //傳回型別為int* 型別(整數型指標),指派大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //傳回型別為 int* 型別(整數型指標),指派大小為 sizeof(int) * 100;
而 malloc 則必須由我們計算要位元組數,並且在返回後強行轉換為實際類型的指標。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函數傳回的是 void * 類型,如果你寫成:p = malloc (sizeof(int)); 則程式無法通過編譯,報錯:「不能將 void* 賦值給 int * 類型變數」。所以必須透過 (int *) 來將強制轉換。
第二、函數的實參為 sizeof(int) ,用來指明一個整數資料所需的大小。如果你寫成:
int* p = (int *) malloc (1);
程式碼也能通過編譯,但事實上只分配了1個位元組大小的記憶體空間,當你往裡頭存入一個整數,就會有3個位元組無家可歸,而直接「住進鄰居家」!造成的結果是後面的記憶體中原有資料內容全部被清空。
malloc 也可以達到 new [] 的效果,申請出一段連續的內存,方法無非是指定你所需要內存大小。
例如想分配100個int類型的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數的記憶體空間。
另外有一點不能直接看出的區別是,malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
除了分配及最後釋放的方法不一樣以外,透過malloc或new得到指針,在其它操作上保持一致。
展開全部
你分兩次分配內存,前一次3個int,可惜你把它丟失了,第二次分配了三個還用這個指針,你沒給新內存頭三個int賦值,直接越界寫了界外的3個int單元,程式沒有立即崩潰已經是很僥倖了
int *p, *p1,i;
p = (int *)malloc(3*sizeof(int));
for(i=0;i
printf("\n int put:");
scanf("%d",p i);
}
p1 = (int *)malloc(3*sizeof(int));
for(i=0; i
printf("\n int put:");
scanf("%d",p1 i);
}
for(i=0;i
for(i=0;i
這個可以看一下malloc函數的原型
void* malloc(int)
malloc的參數是一個整形,表示要申請的記憶體數,以位元組為單位,而返回值是指向那段記憶體的一個指針,是空型別的指針。
而sizeof是一個運算符,透過他能得到一個型別或變數的佔記憶體的位元組數,結果為整形。所以pp=(float *)malloc(sizeof(float));實際上先計算sizeof(float),得到一個float型佔記憶體的位元組數,32位元環境下應該是4位元組,結果就為4,接著malloc(4)申請了一個4位元組的記憶體空間,並傳回這塊記憶體區域的位址,然後強制轉換為float*型別。
關於鍊錶是每一個鍊錶的元素保存了下一個或上一個元素的位址,自然每一個鍊錶元素都要佔記憶體空間的,當要新加入一個鍊錶的元素時首先要為這個元素分配地址,不然資料沒有地方保存。
以上是C語言中動態記憶體分配的malloc函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!