下圖是一個典型的C內存空間分布圖
這是Linux下32位環境的用戶空間內存分布情況
內核空間 :一部分核心軟件獨立於普通應用程序,運行在較高的特權級別上,駐留在被保護的內存空間上,擁有訪問硬件設備的所有權限
內存棧區 :存放函數的參數值,局部變量的值等,在程序運行時由編譯器自動分配。
內存堆區 :存放new或者malloc出來的對象。如main函數里面定義的。
全局靜態區 : 存放全局變量,局部靜態(static)變量和全局靜態變量,初始化的全局變量和靜態變量data段,為初始化的全局變量和靜態變量放在bss段。
常量區 :存放一般常量和字符串常量
代碼區 :存放二進制代碼,只讀,可共享
C/C++不提供垃圾回收機制,因此需要對堆中的數據進行及時銷毀,防止內存泄露,使用free和delete銷毀new和malloc申請的堆內存,而棧內存時動態釋放。
#include <iostream>
using namespace std; int arr[10]; //數組未初始化,空間開辟在bss段上
int arr2[10] = {1,2,3,4,5,6,7,8,9,10}; //數組已初始化,空間開辟在data段
int main() { int arr3[10]; //空間開辟在棧上面
int a = 10; //空間開辟在棧上面
int *p = new int[10]; //空間開辟在堆上面
static int data; //未初始化靜態變量,空間開辟在bss段上
static int data2 = 100;//初始化靜態變量,空間開辟在data段上
return 0; }