c c 程序記憶體分布詳解

2021-09-24 23:37:48 字數 1716 閱讀 5354

乙個程式呼叫的記憶體主要被劃分為4個區域,分別是棧區,堆區,資料區,**區

首先來講講棧區:

然後我們來說堆區:

接下來是資料區:

//在main函式內

char * str = "hallo"; //這裡用乙個指標變數str的記憶體空間存放在棧區裡面佔了sizeof(char *)個位元組,而系統還分配了6個位元組的空間給"hallo"字串,這個字串儲存在資料區中的唯讀資料區

str[2] = 'a'; //這裡如果我們修改字串記憶體,編譯器就會報錯,所以這也說明了唯讀資料區是唯讀的。

#include const int x = 90;

int main()

該區域裡的記憶體空間在程式執行前期(在進入main函式之前)分配(如果記憶體不足程式無法執行),所以全域性資料區不會有野值,如果變數未初始化將自動置為零然後儲存在bss段,如果加了const關鍵字就會儲存在唯讀資料區

該區域裡的記憶體空間在程式退出執行後釋放,故可讀寫的全域性變數不推薦使用

前一次的修改維持到下一次使用

然後,我們在來說說**區:

顧名思義,所有函式對應的二進位制指令均存放在本區域

所以的指令以函式為單位在本區域進行組織存放,程式中有多少函式,本區域就被分成多少份,沒乙份對應乙個函式,因此函式名實際也代表函式在本區域所佔空間的首位址

任何非null的函式指標均指向本區域的某乙個函式

本區域唯讀,可執行

和資料區一樣都是程式執行前分配(main函式以前),所以本區域的生存期為靜態儲存時期(也就是程式執行全期)

我們來通過位址來看看,程序的記憶體分布

#include #include #include char test1 = '1';           //資料區

char test5 = '5'; //

const char test2 = '2'; //資料區唯讀資料區

char test3; //資料區bss段

void code();

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

void code()

程式執行結果

接下來我們來驗證,bss段是不是存放了初始化為0的全域性變數或區域性變數

我們去修改test4的初始化

執行結果

然後我們將test4初始化為非0;

執行結果

C C 記憶體分布

每個程式執行起來以後,它將擁有自己獨立的虛擬位址空間。這個虛擬位址空間的大小與作業系統的位數有關係。例如32位硬體平台的虛擬位址空間的位址可以從0 2 32 1,即0x00000000 0xffffffff,總共4gb大小。在32位windows作業系統中,高位址的2gb位核心空間,使用者空間只有2...

C C 的記憶體分布

說明 1 棧又叫堆疊,非靜態區域性變數 函式引數 返回值等等,棧是向下增長的。2 記憶體對映段是高效的i o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共 享記憶體,做程序間通訊。3 堆用於程式執行時動態記憶體分配,堆是可以上增長的。4 資料段 儲存全域性資料和靜態資料。5...

C C 程式的記憶體分布

理解c c 程式中的記憶體分布,可以幫助我們減少程式設計時犯常見的錯誤,如將指向區域性變數的位址返回等。在c c 中,通常可以把記憶體理解成4個分割槽 棧 堆 全域性 靜態儲存區和常量儲存區。1 棧 通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內 塊作用域 建立 在離開作...