malloc與calloc
1.函數原型
#include<stdlib.h>
void *malloc(unsigned int size); //申請size字節的內存
void *calloc(unsigned int num, unsigned size); //申請num*size字節的內存
2.函數的返回值為void*類型,使用時需強制轉換為所需要的類型;
如果內存申請失敗,則返回NULL,所以使用申請到的內存時需要先進行判斷。
如:char* p = (char*)malloc(6 * sizeof(char));
3.申請的內存位於堆中,不再需要使用時,需調用free函數釋放
void free(void *p);
注意:
1.void *與NULL是完全不同的兩個概念
int *p=NULL;
void *p;
2.malloc與數組的比較:
(1)傳給malloc函數的實參可以是一個表達式,從而可以“動態”申請一塊內存;
(2)使用malloc函數申請的內存可以從函數中返回;而使用數組則不可以(存放在棧中,當函數返回時,棧內存已經被釋放),示例代碼如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 char* func1(); 6 char* func2(); 7 char* pf1; 8 char* pf2; 9 pf1 = func1(); 10 pf2 = func2(); 11 printf("%s\n", pf1); //輸出f1 12 printf("%s\n", pf2); //輸出亂碼,錯誤信息-返回局部變量的地址 13 } 14 15 char* func1() 16 { 17 char* p = (char*)malloc(3 * sizeof(char)); 18 if (p) 19 { 20 p[0] = 'f'; 21 p[1] = '1'; 22 p[2] = '\0'; 23 return p; 24 } 25 return NULL; 26 } 27 28 char* func2() 29 { 30 char p[3] = "f2"; 31 return p; 32 }