C語言記憶體知識補充

2021-08-07 02:06:15 字數 1352 閱讀 7324

對於乙個c語言

程式而言,記憶體空間主要由五個部分組成**段(.text)、資料段(.data)、bss段(.bss),堆和棧組成,其中**段,資料段和bss段是編譯的時候由編譯器分配的,而堆和棧是程式執行的時候由系統分配的。bss中包括我篇部落格中的唯讀資料段(ro data)和已初始化讀寫資料段(rw data)。

bss段:bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數和靜態變數 (這裡注意乙個問題:一般的書上都會說全域性變數和靜態變數是會自動初始化的,那麼哪來的未初始化的變數呢?變數的初始化可以分為顯示初始化和隱式初始化,全域性變數和靜態變數如果程式設計師自己不初始化的話的確也會被初始化,那就是不管什麼型別都初始化為0,這種沒有顯示初始化的就是我們這裡所說的未初始化。既然都是0那麼就沒必要把每個0都儲存起來,從而節省磁碟空間,這是bss的主要作用)的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。 bss節不包含任何資料,只是簡單的維護開始和結束的位址,即總大小,以便記憶體區能在執行時分配並被有效地清零。bss節在應用程式的二進位制映象檔案中並不存在,即不占用磁碟空間而只在執行的時候占用記憶體空間,所以如果全域性變數和靜態變數未初始化那麼其可執行檔案要小很多。

資料段:資料段(data segment)通常是指用來存放程式中已初始化的全域性變數和靜態變數的一塊記憶體區域。資料段屬於靜態記憶體分配,可以分為唯讀資料段和讀寫資料段。字串常量等,但一般都是放在唯讀資料段中。

**段:**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等,但一般都是放在唯讀資料段中。

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

棧(stack):棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。注意:棧空間是向下增長的,每個執行緒有乙個自己的棧,在linux上預設的大小是8m,可以用ulimit檢視和修改。

棧系統提供的功能,特點是快速高效,缺點是有限制,資料不靈活;而堆是函式庫提供的功能,特點是靈活方便,資料適應面廣泛,但是效率有一定降低。

C語言知識補充

做物件導向開發到現在,對c語言的認識在自身歷史上在不斷變化。現在深刻的感覺在c語言上的短板,已然成為自身更好提公升的絆腳石,如在進行較底層原始碼解讀 待整理fp fopen c t.txt r 為了輸入資料,開啟乙個已經存在的文字檔案 為什麼這麼說呢,這裡是 為了向fp這個檔案控制代碼輸入資料 而輸...

c語言資料型別知識補充

主要是在原有知識基礎上對自己知識的進一步補充和掃盲,且均在32位基礎上。1.基本型別 整型資料 short int 2個位元組,16位 括號內為可以省略,乙個位元組8位 int 4個位元組 long int 4個位元組 long long int 8個位元組 unsigned和signed進行組合成...

補充C語言,C

對於元素型別說明和引數傳遞進行整理補充 對於序號設定依舊不通,羞愧 o c語言 typedef structsqlist 順序表型別 sqlist l l.data elemtype malloc sizeof elemtype maxsize malloc m 函式 開闢m位元組長度的位址空間,並...