C和C 的記憶體布局

2021-09-17 23:13:41 字數 1580 閱讀 8816

1.1 記憶體分布圖

stack段:區域性變數存放區域。

heap段:使用者動態分配記憶體區域。

bss段:存放未初始化的全域性或靜態變數記憶體區域。(block started by symbol)

資料段:通常指存放已初始化的全域性變數的記憶體區域。(data segment)

**段:通常指存放程式執行**的一塊記憶體區域。(code segment/text segment)

1.2 在c中分為5個儲存區(記憶體布局)

(1)棧區(stack):由編譯器自動分配釋放,存放函式的引數值,區域性變數等。其操作方式類似資料結構中的棧。

(2)堆區(heap):一般有程式設計師分配釋放,若程式設計師不釋放,程式結束時由系統釋放。與資料結構的堆毫無關係,分配方式類似於鍊錶。malloc,alloc,realloc

(3)全域性/靜態區:全域性變數和靜態變數的儲存是在一塊的。初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域

(4)文字常量區:常量和字串就是存放在這裡。程式結束後由系統釋放。

(5)程式**區:存放函式體的二級制**

總結:

(1)數題中定義的變數通常在棧上,

(2)用malloc,calloc,realloc等分配記憶體的函式分配得到的物件就在堆上。

(3)所有函式體外定義的變數就是全域性變數,加了static修飾符後不管在**都存放在全域性(靜態區),全域性的static變數只對該檔案中有效,不能extern到別的檔案用,在函式體內部定義的static表示在該函式體內郵箱。另外,函式體中的「abcdef」這樣的字串存放在常量區。

int a = 0;//全域性初始化區

char* p ;//全域性未初始化區

void main()

1.3 在c++中分為5個儲存區(記憶體布局)(1)棧區:區域性變數,函式傳參值,自動釋放,效率高但記憶體少

(2)堆區:malloc函式從堆上申請記憶體,用free釋放記憶體,若不釋放,程式結束釋放

(3)自由儲存區:自由儲存區是c++基於new操作符的乙個抽象概念。new操作符在此申請記憶體,用delete釋放記憶體,若不釋放,程式結束釋放

(4)全域性/靜態區:儲存全域性變數或靜態變數。內存在編譯時就分配好了(程式執行前),整個程式執行期間都存在,程式結束時釋放。

(5)常量儲存區:儲存常量(const),不允許修改。

C的記憶體布局

重點關注以下內容 c語言程式在記憶體中各個段的組成 c語言程式連線過程中的特性和常見錯誤 c語言程式的執行方式 一 c語言程式的儲存區域 由c語言 文字檔案 形成可執行程式 二進位制檔案 需要經過編譯 彙編 連線三個階段。編譯過程把c語言文字檔案生成匯程式設計序,彙編過程把匯程式設計序形成二進位制機...

C 記憶體布局

注意,上述只描述的是可執行檔案具有三個段,而不是由該三個段構成。在 linux 下,我們可以通過size命令輸出可執行檔案的段資訊。記憶體布局 存放程式指令和字串常量 我們知道,可執行檔案的文字段包含程式的指令,鏈結器把指令直接從可執行檔案拷貝到記憶體中,形成文字段。存放已初始化的全域性變數和sta...

c 記憶體布局

寫好了 只是第一步,接下來還需要編譯生成對應的二進位制才能使用 預處理,編譯,彙編,鏈結 那麼在執行的時候,和資料在記憶體中都是怎麼分布的呢?c的記憶體布局是怎樣的呢?c 的記憶體布局是怎樣的呢?有一點值得注意,c語言和c 的記憶體布局是不一樣的,這也就是平日裡搜尋c 記憶體布局的文章內容總是很相似...