1. C代碼的內存分佈
一個程序本質上都是由 BSS 段、data段、text段三個組成的。C代碼在運行裝入內存時會增加棧和堆。
C代碼的內存分佈:
區 | 說明 |
---|---|
棧 | 由編譯器在需要時分配,在不需要時自動清除,通常是局部變量、函數參數等 |
堆 | 由程序員自己申請(malloc)和釋放(delete)的內存,如果沒有釋放,程序結束後,可能由操作系統釋放 |
數據段 | 初始化的全局變量和靜態變量,靜態內存分配 |
BSS段 | 未初始化的全局變量,靜態內存分配 |
代碼段 | 存放的是程序代碼,也可能存放一些只讀的常量,如字符串常量等 |
/*全局變量,項目中的所有文件都可以使用這個變量,但外部文件使用前要加extern聲明*/
int a = 1;
/*靜態全局變量,具有文件作用域,即該變量只能在當前文件的任意位置使用*/
static int b;
void func(){
/*局部變量,是在函數體內定義的變量(包括main,各函數同名的局部變量並無影響),
只在函數執行期間存在,在函數調用結束之後變量會被撤銷,其所佔的空間也會被釋放。*/
int c=1;
/*靜態局部變量,只被初始化一次,直到程序結束之前都會一直存在。但是隻能被定義自
己的函數一直可見*/
static int d=2;
}
此外,對於全局變量和static修飾的靜態變量,如果不賦初值,編譯時自動爲該變量賦值爲0。
2. C++內存分佈
基本上和C是差不多的,但有些變化
區 | 說明 |
---|---|
棧 | 由編譯器在需要時分配,在不需要時自動清除,通常是局部變量、函數參數等 |
堆 | 由程序員自己申請(malloc)和釋放(free)的內存,如果沒有釋放,程序結束後,可能由操作系統釋放 |
全局/靜態存儲區 | 初始化的和未初始化的全局變量和靜態變量都在這一塊,C是分開的,C++將其放在同一塊 |
自由存儲區 | 程序員使用操作符new(delete)申請(釋放)的內存 |
常量存儲區 | 存放的是隻讀的常量 |