跳至內容

C語言中動態內存分配的malloc函數

更新時間
快连VPN:速度和安全性最佳的VPN服务
快连VPN:速度和安全性最佳的VPN服务

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函數的詳細內容,更多請關注本站其它相關文章!

更新時間

發表留言

請注意,留言須先通過審核才能發佈。