21天学通C语言-学习笔记(10)
高級應用篇
堆管理(what?)
:與棧平級
動態內存管理
分配內存空間
malloc 函數可以從堆上獲得指定字節數的內存空間,其函數聲明如下:void * malloc(int n); 其中,形參 n為要求分配的字節數。該內存空間未經初始化,所以我們必須要召喚 memset 函數。
memset 函數的函數聲明如下:void * memset(void * p,int c,int n); 其中,p為要清零的內存空間的首地址,c 為要設定的值,n 為被操作的內存空間的字節長度。 如果要使用 memset 清0,變量 c 的實參要為 0。
釋放內存空間
從堆上獲得的內存空間在程序結束后,系統不會自動將其釋放,否則,會導致內存泄漏。free 函數可以實現釋放內存的功能。其函數聲明為:void free (void * p); 由于形參可以接受任意類型的指針實參,所以 free§; 就可以釋放指針 p 指向的內容,而指針的值仍然指向原來指向的地方,然后將指針置為NULL。需要在 return 前加入以下兩行語句:free ( p ); p = NULL;
calloc 分配函數:與malloc 函數相同點在于都從堆上分配內存,不同點在于 calloc
函數得到的內存空間是經過初始化的,其內容全為 0 。由于其聲明如下: void * calloc(int n,int size);
所以calloc 函數適合為數組申請空間,可以將 size 設置為數組元素的空間長度,將 n 設置為數組容量。同樣,程序結束前要釋放
calloc 函數分配的內存空間。
realloc 函數:相比以上三種,realloc 函數不僅可以分配內存,而且可以釋放內存:
realloc(p,0)。函數聲明如下:void * realloc(void *p, int n); 其中,指針 p
為指向堆內存空間的指針,即由上面三種函數分配空間的指針。realloc 分配的空間與 malloc 函數一樣未經初始化。
動態數組:C
語言的內建數組屬于靜態數組,程序運行前就必須確定其數組容量。但是,有的數組需要的容量在程序運行后才會知道;所以我們來借助堆管理來實現動態數組。方法是根據需求,使用分配函數在堆上獲取指定大小的內存空間,最后將這塊內存空間的起始地址作為該數組的首地址。由于動態數組是在堆上獲取的內存空間,所以在程序結束時,必須手動釋放內存。
小結:在使用 malloc 函數、calloc 分配函數、realloc 函數獲取堆內存時,務必要檢查執行結果。
總結
以上是生活随笔為你收集整理的21天学通C语言-学习笔记(10)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 获取td高度_JS或jQuery获
- 下一篇: fetch 自动加cookie_WEBU