今日寫程序,忽然想到一個問題,爲何有時候不要malloc,爲何有時候要呢!好好查資料才瞭解到一些原理。函數
函數原型:void
*
malloc
(unsigned
int
num_bytes); //分配長度爲num_bytes字節的內存塊
spa
返回值是void指針,void* 表示未肯定類型的指針,void *能夠指向任何類型的數據,更明確的說是指申請內存空間時還不知道用戶是用這段空間來存儲什麼類型的數據(好比是char仍是int或者其餘數據類型),能夠經過類型強制轉化轉化爲其餘任意類型指針。若是分配成功則返回指向被分配內存的指針(此存儲區中的初始值不肯定),不然返回空指針NULL。指針
爲何要?什麼時候要?code
malloc()是動態內存分配函數,用來向系統請求分配內存空間。當沒法知道內存具體的位置時,想要綁定真正的內存空間,就要用到malloc()函數。由於malloc只管分配內存空間,並不能對分配的空間進行初始化,因此申請到的內存中的值是隨機的,常常會使用memset()進行置0操做後再使用。 內存
與其配套的是free(),當申請到的空間再也不使用時,要用free()函數將內存空間釋放掉,這樣能夠提升資源利用率,最重要的是----就是由於它能夠申請內存空間,而後根據須要進行釋放,才被稱爲「動態內存分配」! 資源
malloc()函數實質體如今,它有一個能夠將可用內存塊鏈接成一個長長的列表的鏈表,這個鏈表就是所謂的空閒鏈表。調用malloc()函數時,它沿着鏈接表尋找一個大到能夠知足用戶請求要求的連續的內存塊,而後將內存塊一分爲二,一塊的大小與用戶請求的內存大小相等,另外一塊就是剩下的內存塊。接下來,它將用戶申請的那塊傳遞給用戶,將另外一塊返回到鏈接表上(若是另外一塊有的話)。 原型
調用free()函數的時候,它將用戶想要釋放的內存塊連接到空閒鏈上。咱們能夠想到,最後的空閒鏈連接的內存空間一小塊一塊的塊,若是這是用戶申請分配一個較大的內存空間,那麼空閒鏈上可能沒有符合用戶要求的內存塊了,這個時候,malloc()函數請求延時,並開始在空閒鏈上翻箱倒櫃的檢查各內存塊,對他們進行整理,將相鄰的小內存塊合併成較大的內存塊。若是沒法得到符合用於要求的內存空間,那麼malloc()函數就會返回NULL,所以,調用malloc()函數的時候,必定要判斷它的返回值是否爲NULL。string
如何使用?io
int
*p;
p = (
int
*)
malloc
(
sizeof
(
int
) * 128);
//分配128個整型存儲單元,並將這128個連續的整型存儲單元的首地址存儲到指針變量p中
double
*pd = (
double
*)
malloc
(
sizeof
(
double
) * 12);
//
分配12個double型存儲單元,並將首地址存儲到指針變量pd中
#include <stdio.h>
#include <malloc.h>
#define MAX 1000000
int
main(
void
)
{
int
*a[MAX] = {NULL};
int
i;
for
(i=0;i<MAX;i++)
{
a[i]=(
int
*)
malloc
(MAX); //此處沒有判斷返回值
}
return
0;
}
#include "stdio.h"
#include "malloc.h"//malloc()函數被包含在malloc.h裏面
int
main(
void
)
{
char
*a = NULL;
//聲明一個指向a的char*類型的指針
a = (
char
*)
malloc
(100*
sizeof
(
char
));
//使用malloc分配內存的首地址,而後賦值給a
if
(!a)
//若是malloc失敗,能夠獲得一些log, 此處返回條件判斷錯誤,應爲:if(NULL == a)
{
perror
(
"malloc"
);
return
-1;
}
sprintf
(a,
"%s"
,
"HelloWorld\n"
);
//"HelloWorld\n"寫入a指向的地址
printf
(
"%s\n"
,a);
free
(a);
//釋放掉使用的內存地址
return
0;
}