C語言給予了程式設計師絕對的自由,這一點在malloc函式中體現的淋漓盡致。如果一個馬虎的程式設計師在使用malloc函式,沒有仔細甄別,那會十分容易導致整個計算機奔潰。
如果你是C語言程式設計師請記住,無論在何處使用malloc申請了新的動態記憶體空間,都要主動釋放free,程式絕對不會自動幫你做這件事情。
malloc函式負責向計算機申請確定大小的記憶體空間。 free函式負責釋放malloc的申請空間。
(1)函式原型
void free(void *_Memory); void * malloc(size_t _Size)
(2)標頭檔案
stdlib.h
(3)功能
malloc負責申請size_t _Size大小的記憶體空間,並且把所申請得到的記憶體空間首地址, 作為void*返回。使用者往往必須把void*強制轉換。 (注意:程序不會自動釋放malloc申請的變數,無論是在主函式還是子函式,都不會) 正因為malloc申請記憶體不會自動釋放,所以使用malloc必須配套free主動釋放,否則申請 的記憶體空間將會一直存在到程序被結束。如果申請過多,會導致記憶體溢位
(4)基礎例項程式碼
char* ptc = (char*)malloc(30*sizeof(char)); int* pti = (int*)malloc(30*sizeof(int)); for(int i=0;i<30;++i) { printf("%d ",ptc[i]);//用來依次輸出每個字元 } for(int i=0;i<30;++i) { printf("%d ",pti[i]); }p free(ptc); free(pti);
(5)輸出情況
(6)基礎例項程式碼2:
char* ptc = (char*)malloc(30*sizeof(char)); int* pti = (int*)malloc(10*sizeof(int)); char a[]="zobol's Magic Cabin"; int b[10]={1,2,3,4,5,6,7,8,9,10}; strcpy(ptc,a);//字串複製 memcpy(pti,b,10*sizeof(int)); //陣列記憶體複製,注意第三個引數是以位元組為單位 printf("%s\n",ptc);//輸出 for(int i=0;i<10;++i) { printf("%d ",pti[i]); }
(7)輸出情況:
(8)問題1:如果不用free釋放malloc申請的記憶體,會發生什麼事?回答:那你只需要很簡短的程式碼就可以榨乾你的電腦的記憶體。
for(int i=0;i<99999999;++i) { malloc(300000); }
(9)如果不用指標接住malloc申請的記憶體空間的地址,會發生什麼事情?回答:malloc已經向計算機申請了空間了,但是你沒有儲存返回的空間記憶體地址,那就等於白佔用看計算機空間。
(10)在子函式內部malloc申請的空間,會不會隨著子函式結束而釋放?回答:不會!C語言給予了程式設計師絕對的自由,malloc申請的空間,除了程式設計師主動呼叫malloc以外,絕對不會被程式自動釋放。
最新評論