乙個程式呼叫的記憶體主要被劃分為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 棧 通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內 塊作用域 建立 在離開作...