1. 程式人生 > >C語言中內存分配問題:

C語言中內存分配問題:

保存 line data 自動 c語言 再次 變量 cti 初始化

推薦: C語言中內存分配

Linux size命令和C程序的存儲空間布局

本大神感覺,上面的鏈接的內容,已經很好的說明了;

總結一下:

對於一個可執行文件,在linux下可以使用 size命令列出目標文件各部分占的字節數;分為:text段、data段與bss段;(參考:Linux size命令和C程序的存儲空間布局)

對於一個可執行文件,它的存儲空間包括:

  • 1. 代碼區(text segment)。存放CPU執行的機器指令(machine instructions)
  • 2. 全局初始化數據區/靜態數據區(initialized data segment/data segment)。該區包含了在程序中明確被初始化的全局變量、靜態變量(包括全局靜態變量和局部靜態變量)和常量數據(如字符串常量)。
  • 3. 未初始化數據區。亦稱BSS區(uninitialized data segment),存入的是全局未初始化變量。
  • 4. 棧區(stack)。由編譯器自動分配釋放,存放函數的參數值、局部變量的值等。
  • 5. 堆區(heap)。用於動態內存分配。堆在內存中位於bss區和棧區之間。一般由程序員分配和釋放,若程序員不釋放,程序結束時有可能由OS回收。

抄個圖:

說明:左邊為一個可執行文件的三個部分,可以用size查看;右邊為在內存中的存儲空間:(來自:http://blog.csdn.net/youoran/article/details/10990815)

技術分享

感覺很重要的幾點:

1.在C程序中,我們的局部變量都會保存在棧區;

2. 使用malloc或calloc動態分配的空間,是來自堆區的;

3. 棧頂的地址和棧的最大容量是系統預先規定好的,當申請的空間超過棧的剩余空間時,將提示溢出。優其是在使用遞歸時,註意深度; 定義的局部變量的數組時,也不能過大;

說明一對C語言寫的內存管理函數:

malloc()函數:

技術分享

free( )函數:

技術分享

註意:(來自:http://blog.csdn.net/youoran/article/details/10990815)

(1)調用free()釋放內存後,不能再去訪問被釋放的內存空間。內存被釋放後,很有可能該指針仍然指向該內存單元,但這塊內存已經不再屬於原來的應用程序,此時的指針為懸掛指針(可以賦值為NULL)。

(2)不能兩次釋放相同的指針。因為釋放內存空間後,該空間就交給了內存分配子程序,再次釋放內存空間會導致錯誤。也不能用free來釋放非malloc()、calloc()和realloc()函數創建的指針空間,在編程時,也不要將指針進行自加操作,使其指向動態分配的內存空間中間的某個位置,然後直接釋放,這樣也有可能引起錯誤。

(3)在進行C語言程序開發中,malloc/free是配套使用的,即不需要的內存空間都需要釋放回收。

C語言中內存分配問題: