C語言中的malloc函數
需要包含頭文件:
#i nclude
立即學習“C語言免費學習筆記(深入)”;
或
#i nclude
立即學習“C語言免費學習筆記(深入)”;
函數聲明(函數原型):
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得到指針,在其它操作上保持一致。
C語言malloc函數的問題我在下面函數兩次用malloc給 p共6個單位內存
展開全部
你分兩次分配內存,前一次3個int,可惜你把它丟失了,第二次分配了三個還用這個指針,你沒給新內存頭三個int賦值,直接越界寫了界外的3個int單元,程序沒有立即崩潰已經是很僥倖了
int *p, *p1,i;
p = (int *)malloc(3*sizeof(int));
for(i=0;i
printf(" int put:");
scanf("%d",p+i);
}
p1 = (int *)malloc(3*sizeof(int));
for(i=0; i
printf(" int put:");
scanf("%d",p1+i);
}
for(i=0;i
for(i=0;i
超簡單的malloc函數問題
這個可以看一下malloc函數的原型
void* malloc(int)
malloc的參數是一個整形,表示要申請的內存數,以字節爲單位,返回值是指向那段內存的一個指針,是空類型的指針。
而sizeof是一個運算符,通過他能得到一個類型或者變量的佔內存的字節數,結果爲整形。所以pp=(float *)malloc(sizeof(float));實際上先計算sizeof(float),得到一個float型佔內存的字節數,32位環境下應該是4字節,結果就爲4,然後malloc(4)申請了一個4字節的內存空間,並返回這塊內存區域的地址,然後強制轉化爲float*類型。
關於鏈表是每一個鏈表的元素保存了下一個或上一個元素的地址,自然每一個鏈表元素都要佔內存空間的,當要新加入一個鏈表的元素時首先要爲這個元素分配地址,不然數據沒有地方保存。
以上就是C語言中動態內存分配的malloc函數的詳細內容,更多請關注本站其它相關文章!