一、C/C++內存分配
C/C++語言中,內存主要分配在一下五個存儲區:
1.棧:棧中存儲局部變量以及函數實參, 由編譯器負責分配釋放,函數結束,棧中數據失效。
2堆:一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由 OS 回收 。分配方式類似於鏈表。
3全局區/靜態區:存放全局變量以及靜態變量。程序一經編譯好,該區域便存在。並且在C語言中初始化的全局變量和靜態變量和未初始化的放在相鄰的兩個區域(在C++中,由於全局變量和靜態變量編譯器會給這些變量自動初始化賦值,所以沒有區分了)。由於全局變量一直占據內存空間且不易維護,推薦少用。程序結束時釋放。
4常量區:存放各種常量(const修飾以及字符串)。
5代碼區:存放二進制代碼。
二、棧和堆的區別
1.棧是系統提供的功能,特點是效率高,缺點是數據不靈活;堆是函數庫提供的功能,數據適應面廣,但是效率較低。
2.棧是系統數據結構,對於進程/線程是唯一的;堆是函數庫內部結構,不一定唯一。
3.棧中數據分配與釋放,由編譯器自動完成;堆中需要手動完成。
4.棧向下生長,堆向上生長。
5.堆中會出現碎片,棧中不會,因為棧是後進先出的隊列。
三、實例
int a = 0;// 全局初始化區
char *p1;// 全局未初始化區
int main(){
int b; // 棧
char s[] =\"abc\"; // 棧
char *p2;// 棧
char *p3 =\"123456\"; //123456\\0 在常量區, p3 在棧上。
static intc =0;// 全局(靜態)初始化區
p1 = newchar[10];
p2 = newchar[20];
// 分配得來得和字節的區域就在堆區。
strcpy(p1,\"123456\"); //123456\\0 放在常量區,編譯器可能會將它與 p3 所指向的 \"123456\" 優化成一個地方。
}