-
C/C++編譯的程序所占用內存區域一般分為以下5個部分:
- 棧區(stack):由編譯器自動分配和釋放,用來存放函數的參數、局部變量等。其操作方式類似於數據結構中的棧。
- 堆區(heap):一般由程序員分配和釋放(通過malloc/free、new/delete),若程序員沒有釋放,則程序結束時由操作系統回收。它與數據結構中的堆是兩回事,分配方式類似於鏈表。
- 全局/靜態區:全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和初始化的靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域,程序結束后由操作系統回收。
- 文字常量區:存放常量值,如常量字符串等,不允許修改,程序結束后由操作系統回收。
- 程序代碼區:存放函數體的二進制代碼。
-
例子
#include <stdlib.h> #include <string.h> int a = 0; // 全局初始化區 char* p1; // 全局未初始化區 int main() { int a; // 棧區 char s[] = "abc"; // 棧區 char* p2; // 棧區 char* p3 = "123456"; // 123456\0在常量區,p3在棧區 static int c = 0; // 全局/靜態初始化區 p1 = (char*) malloc(10); p2 = (char*) malloc(20); // 分配得來的10和20字節在堆區 strcpy(p1, "123456"); // 123456\0放在常量區,編譯器可能將它與p3所指向的"123456"優化成一個地方 return 0; }