淺談c語言程式碼段 資料段 bss段
程式碼段、資料段、bss段
(1)編譯器在編譯程式的時候,將程式中的所有的元素分成了一些組成部分,各部分構成一個段,所以說段是可執行程式的組成部分。
(2)程式碼段:程式碼段就是程式中的可執行部分,直觀理解程式碼段就是函式堆疊組成的。
(3)資料段(也被稱為資料區、靜態資料區、靜態區):資料段就是程式中的資料,直觀理解就是C語言程式中的全域性變數。(注意:全域性變數才算是程式的資料,區域性變數不算程式的資料,只能算是函式的資料)
(4)bss段(又叫ZI(zero initial)段):bss段的特點就是被初始化為0,bss段本質上也是屬於資料段,bss段就是被初始化為0的資料段。 注意區分:資料段(.data)和bss段的區別和聯絡:二者本來沒有本質區別,都是用來存放C程式中的全域性變數的。區別在於把顯示初始化為非零的全域性變數存在.data段中,而把顯式初始化為0或者並未顯式初始化(C語言規定未顯式初始化的全域性變數值預設為0)的全域性變數存在bss段。
有些特殊資料會被放到程式碼段
(1)C語言中使用char *p = “linux”;定義字串時,字串”linux”實際被分配在程式碼段,也就是說這個”linux”字串實際上是一個常量字串而不是變數字串。
(2)const型常量:C語言中const關鍵字用來定義常量,常量就是不能被改變的量。
const的實現方法至少有2種:
第一種就是編譯將const修飾的變數放在程式碼段去以實現不能修改(普遍見於各種微控制器的編譯器);
第二種就是由編譯器來檢查以確保const型的常量不會被修改,實際上const型的常量還是和普通變數一樣放在資料段的(gcc中就是這樣實現的)。
顯式初始化為非零的全域性變數和靜態區域性變數放在資料段
(1)放在.data段的變數有2種:第一種是顯式初始化為非零的全域性變數。第二種是靜態區域性變數,也就是static修飾的區域性變數。(普通區域性變數分配在棧上,靜態區域性變數分配在.data段)
未初始化或顯式初始化為0的全域性變數放在bss段 (1)bss段和.data段並沒有本質區別,幾乎可以不用明確去區分這兩種。
相關文章
- 資料段data、bss、rodata
- C語言 編寫線段樹C語言
- C語言學習的幾個階段C語言
- SWPUCTF_2019_login(格式字串偏移bss段)字串
- 將資料、程式碼、棧放入不同的段
- 伺服器ip的A段B段C段的區別伺服器
- JS HOOK 程式碼段JSHook
- Linux從頭學03:如何告訴 CPU,程式碼段、資料段、棧段在記憶體中什麼位置?Linux記憶體
- C語言之位段使用詳解C語言
- CSS程式碼段-scss mixinCSS
- Python練手程式碼段(2020.11.11)Python
- 第一段JavaScript程式碼JavaScript
- 前端必會的程式碼段前端
- Pytorch常用程式碼段彙總PyTorch
- 淺談5G頻段的選擇問題
- 七段碼
- 補全一段jQuery程式碼jQuery
- 【有趣】這段java程式碼太古怪Java
- 分享一段牛逼程式碼
- 資料結構-線段樹資料結構
- C語言:使用指標將兩段字串連線起來輸出C語言指標字串
- #pragma data_seg() 共享資料// MyData段 // 程式 // DLL
- ut.cpp 最大線段並減線段交 [線段樹]
- 委託初步瞭解(程式碼段展示)
- [提問交流]有段程式碼沒看懂
- 如何寫一段死鎖程式碼
- SSL連線分為兩個階段:握手和資料傳輸階段
- 來看三段程式
- 統一過程(UP)定義了初啟階段、精化階段、構建階段、移交階段和產生階段,每個階段以達到某個里程碑時結束,其中()的里程碑是生命週期架構。 A.初啟階段 B.精化階段 C.構建階段 D.移交階段架構
- 每天一小段總結Go語言知識Go
- 一段監視 DOM 的神奇程式碼
- python怎麼隱藏一段程式碼Python
- 幽默:朋友發給我一段程式碼
- 程式碼段——C#判斷時間是否在某個範圍C#
- 資料結構--線段樹合併資料結構
- 資料結構(勢能線段樹)資料結構
- hdu 1698 線段樹 一段更新染色
- 在平時開發中,我們會遇到說,某段程式碼執行速度很慢,那麼如何取判斷這段程式碼段的執行時間呢,