程式執行時的記憶體分配

2021-10-14 18:39:55 字數 1366 閱讀 2794

一、在程式執行期間,變數儲存空間有三種:

1、靜態儲存區。內存在程式編譯的時候就已經分配好了,這塊內存在程式執行期間都存在,

儲存全域性變數和靜態變數。

2、棧儲存區。記憶體是在程式執行期間才分配的,函式內區域性變數及函式引數的儲存單元,當

函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率

高但容量小。

3、堆儲存區。在程式執行時由程式設計師用malloc或new申請的記憶體,程式設計師自己負責何時用

free或delete釋放分配的記憶體。頻繁的分配和釋放不同大小的堆記憶體將會產生堆內碎片。

二、程式將作業系統分配給它執行的記憶體分成五個區域:

1、棧區,存放區域性變數,函式引數,返回資料,返回位址等。

2、堆區,由程式設計師分配及釋放。

3、靜態儲存區,存放全域性變數、靜態變數和常量。具體由三部分組成:

1>已初始化的全域性變數和靜態變數。

2>未初始化的全域性變數和靜態變數。

3>常量資料區。

4、文字常量區,程式中使用的常量字串,程式結束後由系統釋放。

5、程式**區,存放函式體的二進位制**。

例1:/

#include

int a=0; //存放在靜態初始化區

const int b=2; //存放在常量資料區

static int val=10; //存放在靜態初始化區

char *p1; //存放在靜態未初始化區

void main(int argc,char *ar**)

/例2:

/#include

int main(int argc,char *ar**)

結果:segmentation fault

說明:「hello」儲存在常量區中,所以不能改變。

/例3:

/#include

int main(int argc,char *ar**)

結果:horld---horld

說明:變數str在儲存棧中,即「world」在棧中,所以可以改變

三、堆疊區別

棧:由系統自動分配,由編譯器管理;申請效率高,但程式設計師無法控制;在函式呼叫中,第

乙個進棧的是主函式中後的下一條指令(函式呼叫語句的下一條可執行語句)的位址,然後

是函式的各個引數,在大多數的c編譯器中,引數是由右往左入棧的,然後是函式中的區域性變

量,當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的

位址,也就是主函式中的下一條指令,程式由該點繼續執行。

堆:由程式設計師申請,由程式設計師管理;速度慢,且容易產生碎片,但程式設計師能夠控制,使用方

便;一般是在堆的頭部用乙個位元組存放堆的大小。堆中的具體內容有程式設計師安排。

c 程式執行時的記憶體分配

c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1 棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。2 堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個del...

程式及其執行時記憶體分配解析

乙個c c 程式占用的記憶體可分為以下5種 2.堆區 一般由程式設計師分配和釋放,此堆和資料結構堆完全是兩回事,此堆的分配釋放方式類似於鍊錶。執行時操作。3.全域性 靜態區 全域性變數和靜態變數存放於此。而初始化和非初始化的全域性 靜態變數又放在不同的兩塊。程式結束由系統釋放。4.文字常量區 常量字...

程式編譯後執行時的記憶體分配

參考文章之編譯 執行 參考文章之執行程式時的記憶體分配方式 bss段 參考文章之程式執行時的記憶體分配 參考文章之堆 棧 1.程式編譯時的記憶體狀況 編譯時不分配記憶體。編譯器能夠識別語法,資料型別等 然後逐行逐句檢查編譯成資料的.obj檔案 然後再由連線程式將其連線成乙個exe檔案 此時的程式以e...