char *pt = (char *)malloc(sizeof(char *));
char *pt = (char *)relloc(20, sizeof(char *));
區別如下:
malloc不能初始化所分配的內存空間,而函數calloc能。如果malloc函數分配的內存空間原來沒有被使用過,則其中的每一位可能都是0;反之,如果這部分內存曾經被分配過,則其中可能遺留各種各樣的數據,也就是說,使用malloc函數的程序開始時(內存還沒有被重新分配)能正常進行,但經過一段時間(內存已經被重新分配,可能會出現一些問題)。實現原理
malloc、calloc 函數的實質體現在,它有一個將可用的內存連接爲一個長長的鏈表(即所謂的空閒鏈表)。調用 malloc 函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊,然後將該內存塊一分爲二(一塊的大小與用戶申請的大小一樣,另一塊就是剩下的字節),接下來,將分配給用戶的那塊內存傳給用戶,並將剩下的那塊(如果有的話),返回到鏈表上,調用free函數 時,它將用戶釋放的內存塊連接到空鏈上,到最後,空閒鏈表會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那麼空閒鏈上可能沒有可能滿足用戶要求的片段了,於是 malloc 函數請求延時,並開始在空間中翻箱倒櫃的檢查內存片段,對它們進行整理,並將相鄰的小空閒塊合成較大的內存塊
realloc 是從堆空間上分配內存,當擴大一塊內存空間時,realloc 試圖直接從現存的數據後面的哪些字節中獲得附加的字節,如果能夠滿足,自然天下太平,那麼如果後面的字節不夠,問題就來了,那麼就使用堆上第一個足夠滿足要求的自由空間塊,現存的數據然後就被拷貝到新的位置上,而老塊則放回堆空間,這句話傳遞的一個很重要的信息就是數據可能被移動。