C 語言內(nèi)存管理指對系統(tǒng)內(nèi)存的分配、創(chuàng)建、使用這一系列操作。在內(nèi)存管理中,由于是操作系統(tǒng)內(nèi)存,使用不當(dāng)會造成畢竟麻煩的結(jié)果。本文將從系統(tǒng)內(nèi)存的分配、創(chuàng)建出發(fā),并且使用例子來舉例說明內(nèi)存管理不當(dāng)會出現(xiàn)的情況及解決辦法。
一、內(nèi)存
在計算機中,每個應(yīng)用程序之間的內(nèi)存是相互獨立的,通常情況下應(yīng)用程序 A 并不能訪問應(yīng)用程序 B,當(dāng)然一些特殊技巧可以訪問,但此文并不詳細(xì)進行說明。例如在計算機中,一個視頻播放程序與一個瀏覽器程序,它們的內(nèi)存并不能訪問,每個程序所擁有的內(nèi)存是分區(qū)進行管理的。在計算機系統(tǒng)中,運行程序 A 將會在內(nèi)存中開辟程序 A 的內(nèi)存區(qū)域 1,運行程序 B 將會在內(nèi)存中開辟程序 B 的內(nèi)存區(qū)域 2,內(nèi)存區(qū)域 1 與內(nèi)存區(qū)域 2 之間邏輯分隔。
1.1 內(nèi)存四區(qū)
在程序 A 開辟的內(nèi)存區(qū)域 1 會被分為幾個區(qū)域,這就是內(nèi)存四區(qū),內(nèi)存四區(qū)分為棧區(qū)、堆區(qū)、數(shù)據(jù)區(qū)與代碼區(qū)。棧區(qū)指的是存儲一些臨時變量的區(qū)域,臨時變量包括了局部變量、返回值、參數(shù)、返回地址等,當(dāng)這些變量超出了當(dāng)前作用域時將會自動彈出。該棧的最大存儲是有大小的,該值固定,超過該大小將會造成棧溢出。堆區(qū)指的是一個比較大的內(nèi)存空間,主要用于對動態(tài)內(nèi)存的分配;在程序開發(fā)中一般是開發(fā)人員進行分配與釋放,若在程序結(jié)束時都未釋放,系統(tǒng)將會自動進行回收。數(shù)據(jù)區(qū)指的是主要存放全局變量、常量和靜態(tài)變量的區(qū)域,數(shù)據(jù)區(qū)又可以進行劃分,分為全局區(qū)與靜態(tài)區(qū)。全局變量與靜態(tài)變量將會存放至該區(qū)域。代碼區(qū)就比較好理解了,主要是存儲可執(zhí)行代碼,該區(qū)域的屬性是只讀的。