當一個程序運行時,這個程序不同的部分也會在內存的不同的區域上面存儲
代碼段:程序運行時會把可執行文件的內存加載到這塊內存,程序如何運行由代碼段的數據決定,代碼段的內容是只讀。
只讀段:用來存儲只讀數據的,如:字面值數據,常量。
數據段:存儲初始化過的全局變量、靜態變量。
靜態數據段:存儲未初始化過的全局變量、靜態變量(這段內存在程序運行前會被初始化為零,這也是為什么全局變量會有默認值)。
棧:存儲局部變量、塊變量等數據,這段內存有操作系統管理,自動申請自動釋放。
堆:由程序員管理的一塊內存。
下面來說說棧與堆的區別:
棧:它是采一種棧結構(先進后出)的方式管理內存,它的申請和釋放歸操作系統管理。
棧內存的大小有限,不適合保存大量數據。
棧內存可以與標識符建立聯系(定義變量)。
棧內存不適合長久保存數據(當函數結束后它就會被釋放)。
棧內存歸操作系統管理,幾乎不會出現什么錯誤。
棧內存使用方便,隨時定義、使用、釋放。
堆:數據無序的順序存儲在內存中,它的申請和釋放受程序員的控制。
堆內存的大小理論上等於物理內存的大小。
堆內存只能與指針配合使用(無法取名字)。
堆內存的釋放是受控制的,一般程序中長期使用的數據都會從數據庫、文件中讀取到堆內存中。
堆內存歸程序員管理,如果程序員的水平有限可能會出現內存泄漏、碎片等問題。
堆內存使用麻煩,需要借助標准庫函數(頭文件),申請(計算大小)、使用(與指針配合)、釋放(不能重復放、指針要置空)。