c語言程式經過編譯連線後形成的二進位制映像檔案由棧,堆,資料段和**段組成。其中資料段(由三部分部分組成:唯讀資料段,已經初始化讀寫資料段,未初始化資料段即bbs)。
1.棧區(stack):又叫堆疊,先進先出,由編譯器自動分配釋放,存放函式的引數值,區域性變數等值。其操作方式類似於資料結構中的棧。
2.堆區(heap):一般由程式設計師分配釋放,若程式設計師不釋放,則可能會引起記憶體洩漏。注堆和資料結構中的堆疊不一樣,其類是與鍊錶。
3.程式**區:存放函式體的二進位制**。
4.資料段:由三部分組成:
1> 唯讀資料段:
唯讀資料段是程式使用的一些不會被更改的資料,使用這些資料的方式類似查表式的操作,由於這些變數不需要更改,因此只需要放置在唯讀儲存器中即可。一般是const修飾的變數以及程式中使用的文字常量一般會存放在唯讀資料段中。
2>已初始化的讀寫資料段:
已初始化資料是在程式中宣告,並且具有初值的變數,這些變數需要占用儲存器的空間,在程式執行時它們需要位於可讀寫的記憶體區域內,並且有初值,以供程式執行時讀寫。在程式中一般為已經初始化的全域性變數,已經初始化的靜態區域性變數(static修飾的已經初始化的變數)
3>未初始化段(bss):
未初始化資料是在程式中宣告,但是沒有初始化的變數,這些變數在程式執行之前不需要占用儲存器的空間。與讀寫資料段類似,它也屬於靜態資料區。但是該段中資料沒有經過初始化。未初始化資料段只有在執行的初始化階段才會產生,因此它的大小不會影響目標檔案的大小。在程式中一般是沒有初始化的全域性變數和沒有初始化的靜態區域性變數.
程式的各個段
section 結構 sections region phdr fill secname 段名 contents 決定哪些內容存放在此段 start 本段的連線位址 實際執行位址 at ldadr 儲存位址 載入的位址 例子u boot.lds 根據上面的section的介紹,雖能大體看懂,但是還是...
深入C語言記憶體區域分配 程序的各個段 詳解
一般情況下,乙個可執行二進位制程式 更確切的說,在linux作業系統下為乙個程序單元,在uc osii中被稱為任務 在儲存 沒有調入到記憶體執行 時擁有3個部分,分別是 段 text 資料段 data 和bss段。這3個部分一起組成了該可執行程式的檔案 c語言可執行 結構 名稱內容 段可執行 字串常...
C語言段錯誤
當我在linux下寫c語言的時候經常會遇到段錯誤.所以就來細究一下.段錯誤或段違規 segmentation violation 檢視expert c programming peter van der linden pg.156 解釋到段錯誤是由於記憶體管理單元 mmu 的異常所致,而該異常則通常...