【FROM MSDN && 百科】
原型: void *malloc(unsigned int size);
#include<stdlib.h>或#include <malloc.h>
malloc的全稱是memory allocation,中文叫動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。
malloc 向系統申請分配指定size個字節的內存空間(連續的一塊內存)。返回類型是 void* 類型。void* 表示未確定類型的指針。
void *可以指向任何類型的數據,更明確的說是指申請內存空間時還不知道用戶是用這段空間來存儲什麼類型的數據,C,C++規定,void*
類型可以強制轉換爲任何其它類型的指針。
allocates a block of size bytes of memory, returning a pointer to the beginning of the block.
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。
比如想分配100個int類型的空間:int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數的內存空間。
malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
申請零字節內存,函數並不返回NULL,而是返回一個正常的內存地址,但是你卻無法使用這塊大小爲0的內存。
DEMO:
- #include <stdio.h>
- #include <conio.h>
- int main(void)
- {
- int i,n;
- char *buffer;
- printf("How long do you want the string ?");
- scanf("%d",&i);
- buffer=(char *)malloc(i+1);
- if (buffer == NULL)
- {
- exit(1);
- }
- for (n=0;n<i;n++)
- {
- buffer[n]=rand()%26+'a'; /*generate 0-25 */
- }
- buffer[i]='\0';
- printf("Random string :%s\n",buffer);
- free(buffer);
- getch();
- return 0;
- }
malloc 和 new 至少有兩個不同: new 返回指定類型的指針,並且可以自動計算所需要大小。而 malloc 則必須要由我們計算字節數,並且在返回後強行轉換爲實際類型的指針。
double *pd=(double *) malloc (sizeof(double)*12);//分配12個double型存儲單元,並將首地址存儲到指針變量pd中
malloc函數的實質體現在,它有一個將可用的內存塊連接爲一個長長的列表的所謂空閒鏈表。調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。然後,將該內存塊一分爲二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節)。接下來,將分配給用戶的那塊內存傳給用戶,並將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閒鏈上。到最後,空閒鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那麼空閒鏈上可能沒有可以滿足用戶要求的片段了。於是,malloc函數請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各內存片段,對它們進行整理,將相鄰的小空閒塊合併成較大的內存塊。如果無法獲得符合要求的內存塊,malloc函數會返回NULL指針,因此在調用malloc動態申請內存塊時,一定要進行返回值的判斷。
DEMO:
- #include <stdio.h>
- #include <conio.h>
- int main(void)
- {
- char *ptr;
- /*把0賦給malloc能得到一個合法的指針。*/
- if ((ptr=(char*)malloc(0))==NULL)
- {
- puts("Got a null pointer");
- }
- else
- {
- puts("Got a valid pointer");
- }
- getch();
- return 0;
- }