c語言動態存儲分配
① c語言中的動態內存分配的用法舉例
1、malloc函數:其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。
2、free函數:由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變數或者程序使用。這時我們就要用到free函數。
3、calloc函數:其作用是在內存的動態存儲區中分配n個長度為 size 的連續空間。函數返回一個指向分配區域的起始位置的指針;如果分配不成功,則返回NULL。
(1)c語言動態存儲分配擴展閱讀:
函數運算符:
new
運算符new用於向系統申請動態存儲空間,並把首地址作為運算結果,它的使用形式為:
指針變數=new 數據類型;
例如:
int *p=new int
該語句的作用是會用new從內存中申請了一個int型變數(4個位元組),並將該變數的首地址賦給指針變數p。
new所建立的變數的初始值是任意的,也可在用new分配內存的同時進行初始化。使用形式為:
指針變數=new 數據類型(初始值)。
delete
堆內存可按照要求進行分配,程序對內存的需求量隨時會發生變化,有時程序在運行種可能會不再需要由new分配的內存空間,而且程序還未運行結束,這時就需要把先前佔用的內存空間釋放給堆內存,以後重新分配,供程序的其他部分使用。運算符delete用於釋放new分配的內存空間,刪除建立的對象,它的使用形式為:
delete指針變數;
其中的指針變數中保存著new分配的內存的首地址。
② C語言中,malloc函數動態分配內存後,如果不用free去釋放,函數結束後空間會不會由系統釋放
在程序中使用free釋放,否則該段內存不會被釋放掉。
C語言不會釋放。所謂動態內存,是由malloc系列函數進行申請的內存,除非在程序中使用free釋放,否則該段內存不會被釋放掉。
標准庫中malloc函數的實現原理。要了解針對malloc的內存存儲結構,malloc不像全局變數一樣,不是在編譯器編譯的時候就會分配內存空間,而是在調用到malloc函數時才會分配空間。有時還會中途調用free函數釋放空間出來。
(2)c語言動態存儲分配擴展閱讀
free:釋放malloc分配的存儲空間
malloc用於向系統申請一定數量的內存,如果你的程序一味的申請內存供自己使用,那麼系統可分配給其它程序的內存就會減少,到最後無內存可用,最終導致系統運行緩慢,不穩定等問題。顯然,這種只索取不奉獻的行為是不可取的因此,C語言提供了free函數,用於向系統返還借用的內存。
當忘記使用free釋放由malloc分配的內存時,表明程序存在」內存泄露「這一頑疾,因此對於上面的程序,在return 0之前,使用下面的代碼進行完善。
③ C語言 malloc()函數 分配內存空間尺寸的問題
這個問題首先得從堆棧說起,一個程序一般分為三段:代碼段,數據段(靜態數據),和堆棧段。堆棧段存儲程序中的變數、程序傳遞的參數等(動態分配的變數存儲在堆中,靜態分配的存儲在棧中)。堆棧的增長方式如下:
程序在運行的時候會預先分配堆棧空間,所以你的問題中不一定修改了不該修改的地方,有可能那裡本來就是空的。
再回到malloc這個函數上來,malloc主要負責分配空間,返回該空間的首地址。那為什麼申請空間為0,卻可以存儲7個字元呢?那是因為C語言的指針中並不檢查數組的越界問題,不信的話,你可以這樣:char ch[5],然後你去讀寫ch[6](printf或scanf),這樣是不會報錯的。但是我們在使用的時候,千萬別越界使用,因為這樣的程序是非常危險的,試想,如果越界使用的地址正好是一個操作系統的地址,那麼你一修改,系統就崩了。同時,C語言的這個機制被黑客廣泛地應用與緩沖區溢出攻擊,所以你非但不能越界使用指針,還得時刻考慮到指針(數組)是否越界,以加強程序的安全性。
希望對你有所幫助。。。