C語言記憶體機制

2022-03-20 03:08:23 字數 1428 閱讀 1175

最近有參加一些c/c++類的面試,感覺筆試的題目大都偏重於考察基本原理,這對我來說是乙個不小的挑戰.平時學習的時候往往忽視了那些基本原理,急於動手去實踐,結果忽視了靈魂性的東西.今後的學習中,禁忌一味動手寫**,要結合理論多思考,多問些為什麼,不然就真成為了**民工了,知其然,知其所以然,才能成為大師.

關於c的記憶體區域,大家基本上都把它劃分為五部分,下面就一起去認識這些我們經常打交道卻很少研究的五個區域.

我們首先從最淺顯的區域說起,當大家遇到乙個諸如so easy a+b的問題時會三下五去二的把程式寫完,那這些程式是不是也需要乙個地方來存放呢?對的,在c語言中有存貯c程式的區域,稱為程式**區.

在寫程式時,字串可謂是相當的活躍,字串在大部分c程式中都有很大的比重,因此在c記憶體機制中,特別有一塊存放字串常量的區域,被稱為c風格字串常量儲存區,在程式結束時,由系統自動收回.

接下來的三種就存在我們寫程式的過程中了,在我們寫一些功能較強的c程式時,往往需要多個功能函式,有的變數需要貫穿多個函式模組所以我們把這些變數定義為全域性變數.當我們把變數定義為全域性變數時,系統便把這些變數存放在專用的全域性變數區.其中,需要注意的是static修飾的變數在記憶體中和全域性變數是存放在乙個地方的,因此我們習慣稱這部分為全域性變數和靜態變數存放區,簡稱靜態區和全域性區.

當我們在main函式或者其他函式中定義乙個變數的時候,覺得我們並沒有刻意為這些變數來分配記憶體.恩,其實我們在定義這些區域性變數的時候,系統自動的便根據我們的資料型別來在指定的區域內分配了記憶體.我們一般稱這個指定的記憶體區域為棧.棧除了存放我們區域性變數還有函式的實參.

在我們構造鍊錶的節點時,會為新節點來 malloc乙個新的節點區域,這樣我們用malloc來手動分配記憶體的區域被稱為堆.當你申請記憶體的時候也許很隨意,但一定要記得不用的時候free掉這些記憶體,否則便會造成c++中著名的記憶體洩漏問題.最後在提醒大家,即使申請了記憶體而且不用的時候及時的釋放了,還是不要太頻繁,不然這樣來來回回又會造成記憶體碎片的問題.

經過上面的總結,我們可以把c的儲存區域簡單明確的歸納為:

程式**區      c二進位制**

常量儲存區      c字串形常量

全域性/靜態區     全域性變數/靜態變數

棧          區域性變數/函式實參

堆          程式設計師手動分配記憶體                                            

參考資料 

下面著重分析下堆和棧.

堆和棧是我們比較常用的記憶體區域,一般來說我們定義的區域性變數更多一些,所以棧的使用更為頻繁.而且棧和堆相比,棧的訪問更高效,這是因為我們的計算機從構架上就直接對棧有了支援,有專用的暫存器來維護資料在棧內的進出.而對於堆來說,計算機本身是不支援的,它是靠一些庫函式來操作的,因此在效率上要慢一些.

但為什麼我們還需要堆,這是因為棧可以定義的資料型別也就是計算機直接支援的,比如整形/浮點型/字元型等,資料型別比較單一,而堆的資料面更廣一點.         

C語言記憶體機制詳解

對於乙個c語言程式而言,記憶體空間主要由五個部分組成 段 text 資料段 data bss段 bss 堆和棧組成,其中 段,資料段和bss段是編譯的時候由編譯器分配的,而堆和 在上圖中,由編譯器分配的位址空間都是在連線的時候分配的,而執行時分配的空間是在程式執行時由系統分配的 bss段 bss段 ...

c 記憶體機制

首先,來談談c 的5個儲存區 1.棧 是分配給函式區域性變數的儲存單元,函式結束後,該變數的儲存單元自動釋放,效率高,分配的空間有限。2.堆 由new建立,由delete釋放的動態記憶體單元。如果使用者不釋放該記憶體,程式結束時,系統會自動 3.自由儲存區 由malloc建立,由free釋放的動態記...

C 記憶體機制

今天面試一頭霧水,學習c 的時候沒怎麼了解c 的記憶體機制,教科書上竟然沒有!what?老師上課只是提了一下,沒有說的很細,而且時間過去了好長時間,今天面試的時候面試官問我 說一下你對c 記憶體機制的理解!噗,一下慌了,只想起來堆,棧,還有全域性靜態,面試官笑了給我簡單講了一下還。回去之後趕緊仔細查...