該篇部落格是自己學習的總結,如果有**理解的不對的地方,希望大家可以指點。
一、c記憶體空間分布圖
二、各記憶體區域詳解
1.**區(.text): 該區域主要存放二進位制可執行檔案。
2.資料區(.data): 資料區可詳細分為三塊區域,分別是唯讀資料區、初始化資料區、未初始化資料區。
1). 唯讀資料區(.ordata) : 顧名思義,這個區域存放的是一些常量,包括字串常量、const修飾的全域性變數;
注意一: 字串常量都是儲存在唯讀資料區的。看下面乙個例子,
1 #include 2除錯結構為:3int main(void)4
the address of array: 0xbfa5052f
the address of string: 0x80485f5
w love china
看到這裡可能就迷糊了,上面不是說字串常量都存放在唯讀資料區嗎?其實原因是這樣的,當我們用字串初始化字元陣列時,是先將字串字面量儲存在唯讀資料區,當呼叫該初始化所在函式時,會將在資料區的資料拷貝乙份到當前陣列,當前執行的程式中就有兩個''i love china'';我們改變了的其實是賦值到字元陣列str所對應的在棧中的空間的值,而存放在資料區的字串常量並沒有改變。
注意二: 而const修飾的區域性變數還是像普通的區域性變數一樣存放在棧中,只是不能顯式的改變該變數。
2). 初始化資料區(.rwdata): 該區域用來存放初始化不為0的全域性變數和static修飾的區域性變數。
3). 未初始化資料區(.bss): 與初始化資料區類似,但是它存放的是初始化為0、未初始化的全域性變數和static修飾的區域性變數。這樣做的目的主要是為了減少可執行二進位制檔案占用的儲存空間,特別是在一些嵌入式裝置中顯得尤其重要。如下圖,
1 #include 23int arr[2000] = ;45
int main(void)6
1 #include 23. 棧: 棧存放的是程式中的區域性變數, 當然函式形參、返回值也都儲存在棧中。棧是由系統自動管理,變數的出棧入棧操作都由系統通過移動棧頂指標來完成來完成,並不是真正的清除變數,所以當我們使用區域性變數之前一定要給它賦值,否則就是乙個不確定的值。3int arr[2000] = ;45
int main(void)6
4.堆: 堆空間解決了自動分配不靈活,對記憶體造成浪費等問題。可以通過malloc函式申請所需大小的空間,注意這塊空間申請了之後會一直存在,所以一定要和free一起使用,等用完之後馬上釋放,否則會造成記憶體洩漏,嚴重會導致程式停止執行。我們使用mallco函式帶來方便靈活的同時,也帶來了記憶體碎片的問題,所以當要求程式長時間執行時,必不可免的就要解決malloc帶來的記憶體碎片問題。
程式執行時的記憶體
當乙個源 通過gcc編譯成a.out,執行a.out時 程式便開始了執行之旅 即程序 作業系統為程序分配堆疊空間,隨後把程式執行碼放入文字段,把程式經過初始化的全域性變數和靜態變數放入data 把程式為初始化的全域性變數和靜態變數放入bss段 並對bss段資料初始化為0 之後cpu 段指標指向mai...
c 程式執行時的記憶體分配
c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1 棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。2 堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個del...
程式執行時記憶體管理
1,管理執行階段記憶體空間分配 malloc new int pn new int 儲存的型別,記憶體根據此設定相應儲存位元組的記憶體 pn是記憶體位址 所以 當宣告乙個變數的指標變數時沒初始化,宣告後再來初始化則pn 接收的應該是變數在記憶體中的位址 variablename pn是儲存在記憶體的...