C 區分記憶體分配的方式

2021-06-09 22:43:49 字數 764 閱讀 2953

1. 程式執行空間布局:

**區、資料區、堆區、棧區

2. **區:

程式的執行**。

3. 資料區:

全域性資料、常量、靜態變數

(1)自由儲存區:

由malloc等分配的記憶體塊,和堆十分類似,但是它是由free釋放記憶體。

(2)全域性/靜態儲存區:

全域性變數和靜態變數被分配到同一塊記憶體中,c語言中,全域性變數又分為初始化的和未初始化的,但是c++中沒有此區分。

(3)常量儲存區:

存放的是常量,不允許修改。

4. 堆區:

由new分配的記憶體塊,編譯器不會管它的釋放,由應用程式使用delete進行釋放,如果程式設計師沒有釋放,程式結束後由作業系統自動**。

5. 棧區:

在執行函式時,函式內區域性變數的儲存單元在棧上分配,函式結束後,這些儲存單元自動釋放。

6. 堆和棧的區別:

(1)管理方式不同;

(2)空間大小不同;

(3)碎片問題;

對於堆,頻繁的new/delete將造成記憶體空間的不連續,從而產生大量的碎片,使程式效率降低。

(4)生長方向;

堆的生長方向是向上的,向記憶體位址增加的方向增長;棧的生長方向是向下的,向著記憶體位址減小的方向增長。

(5)分配方式;

棧有兩種分配方式:靜態分配和動態分配,靜態分配是由編譯器完成的,比如區域性變數的分配。動態分配由alloca函式完成,且由編譯器進行釋放。

(6)分配效率;

堆的效率要比棧低的多。

區分記憶體分配的方式

導言 在c 的世界裡,燙 和 屯 是我們遇到最多的兩個漢字 限於vc使用者 為什麼呢?答案 在vc裡,棧空間未初始化的字元預設是 52,補碼是0xcc。兩個0xcc,即0xcccc在gbk編碼中就是 燙 堆空間未初始化的字元預設是 51,兩個 51在gbk編碼中就是 屯 二者都是未初始化的記憶體。關...

C 記憶體分配的方式

c 記憶體分配的方式有三種 分別是從靜態儲存區分配,從棧上分配記憶體和從堆上分配記憶體。從靜態儲存區域分配的內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。靜態分配的區域的生命期是整個軟體執行期,就是說從軟體執行開始到軟體終止退出。只有軟體終止...

C記憶體分配方式與C 記憶體分配方式

c記憶體分配方式 注 malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二 一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組 接下來,將分配...