c 記憶體分配詳解

2021-06-30 16:58:19 字數 1240 閱讀 6555

一、c/c++記憶體分配的5個區分別是:

棧區、堆區、全域性區(靜態區)、文字常量區、程式**區

1、棧區:編輯器自動分配 和 釋放,存放函式的引數,區域性變數等。 

2、堆區:一般是程式設計師分配和釋放,如果在程式一直執行的狀態下,程式設計師不去釋放記憶體,會導致記憶體洩漏之後會打到一定程度的時候會導致系統崩潰。   或者如果程式設計師沒有釋放記憶體但程序結束時,記憶體的**是由os來**的 

3、全域性區(靜態區):全域性變數和靜態變數 在不初始化的情況下預設的是0,存放在一塊區域。   如果是初始化的話是存放在相鄰的另一塊區域。 程式結束時是由系統來釋放記憶體的。

4、文字常量區:所有的字串都存放在文字常量區。   當程式結束時由系統釋放。

5、程式**區:程式設計師寫的所有**都是存放在**區的。

二、堆和棧的區別

記憶體的管理方式: 

棧:是由編輯器自動管理,宣告變數時分配空間,變數結束使用時釋放空間。

堆:是由程式設計師負責分配和釋放的,  對於c用malloc來分配記憶體,用free釋放記憶體。 對於c++用new來分配記憶體,用delete釋放記憶體。 但對於堆容易造成記憶體洩漏

空間的大小不同:

棧:在windows下,棧是向低位址擴充套件擴充套件的資料結構,是一塊連續的記憶體區域。就是說棧頂的位址事先規定好,一般情況下windows下棧的大小是2m。當申請的空間超過棧的剩餘空間時,將提示overflow。

堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。系統是用鍊錶儲存空閒的記憶體位址。堆的大小受限與計算機系統中有效的虛擬記憶體,因此堆獲得的空間比較靈活,也是比較大的。

記憶體的分配方式:

堆:堆是由程式設計師分配和釋放記憶體的。但往往很多程式設計師都是分配記憶體之後忘了釋放記憶體。 所以這樣很容易導致記憶體洩漏

分配速率:

棧:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。

堆:堆為了分配一塊記憶體,庫函式會按照某種演算法在堆記憶體尋找可用的足夠大小的空間,如果沒有足夠大小的空間,就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就會分到足夠大小的記憶體,然後進行返回。這種分配方式的效率比較慢。

三、程式例子

#include #include int a;				// 預設初始化為0,全域性未初始化區

int b = 3; // 全域性初始化區

int c = 4; // 全域性初始化區

int main()

c 記憶體分配詳解

c語言可執行 結構 名稱內容 段可執行 字串常量 資料段已初始化全域性變數 已初始化全域性靜態變數 區域性靜態變數 常量資料 bss段 未初始化全域性變數,未初始化全域性靜態變數 棧區域性變數 函式引數 堆動態記憶體分配 一般情況下,乙個可執行二進位制程式 更確切的說,在linux作業系統下為乙個程...

C 中記憶體分配詳解

程式執行時,特別要注意的是記憶體的分配。下面介紹c 程式設計中的記憶體分配。一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資...

C 程式記憶體分配詳解

1.硬碟中的結構 程式 首先在linux下檢視一下test檔案的資訊 root localhost ctest file test 此檔案基本情況 test elf 32 bit lsb executable,intel 80386,version 1 sysv for gnu linux 2.2....