淺談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段並沒有本質區別,幾乎可以不用明確去區分這兩種。
相關文章
- 程式段.text, data (initialized), bss, stack, heapZed
- C語言 編寫線段樹C語言
- 57段讓編譯器崩潰的C語言程式碼編譯C語言
- 虛擬地址空間,堆疊,堆,資料段,程式碼段
- 淺談線段樹(Segment Tree)
- C語言學習的幾個階段C語言
- Oracle之 資料塊、區段和段Oracle
- 伺服器ip的A段B段C段的區別伺服器
- 將資料、程式碼、棧放入不同的段
- iOS 程式碼段收集iOS
- javascript常用程式碼段JavaScript
- 第三章、c語言高階階段C語言
- Linux從頭學03:如何告訴 CPU,程式碼段、資料段、棧段在記憶體中什麼位置?Linux記憶體
- 淺談mysql的兩階段提交協議MySql協議
- C語言之位段使用詳解C語言
- CSS程式碼段-scss mixinCSS
- 這段程式碼如何理解?
- 資料庫發展階段之資料庫系統階段資料庫
- 一段後臺C#查詢SQL Server資料庫程式碼C#SQLServer資料庫
- 各年齡段開發者最愛的程式語言,就是它了!
- 前端必會的程式碼段前端
- 第一段JavaScript程式碼JavaScript
- android 截圖程式碼段Android
- 無聊程式碼一段
- SWPUCTF_2019_login(格式字串偏移bss段)字串
- 七段碼
- 資料結構-線段樹資料結構
- 使用Go語言一段時間的感受Go
- 資料塊、資料擴充套件、段套件
- 【有趣】這段java程式碼太古怪Java
- 補全一段jQuery程式碼jQuery
- 分享一段牛逼程式碼
- Android 複製文字程式碼段Android
- C語言:使用指標將兩段字串連線起來輸出C語言指標字串
- #pragma data_seg() 共享資料// MyData段 // 程式 // DLL
- 禁用 C# 編譯器對某段程式碼的警告C#編譯
- Python 是各年齡段開發者最愛的語言Python
- SSL連線分為兩個階段:握手和資料傳輸階段