1.記憶體分區: 高(記憶體地址大) 棧底 棧區 堆區 靜態區 常量區 低(記憶體地址小) 代碼區 2.棧:數據結構 (1)特點:先進後出 (2)操作:入棧(push)出棧(pop) (3)棧從高->低分配空間 char a = 0; char b = 0; char c = 0; printf(“a:%
1.記憶體分區: 高(記憶體地址大) 棧底 棧區 堆區
靜態區 常量區
低(記憶體地址小) 代碼區 2.棧:數據結構 (1)特點:先進後出 (2)操作:入棧(push)出棧(pop) (3)棧從高->低分配空間 char a = 0; char b = 0; char c = 0; printf(“a:%p\n”,&a); printf(“b:%p\n”,&b); printf(“c:%p\n”,&c); (4)棧從低->高使用 char n1 = 1; char n2 = 0; short *p = &n2; printf(“%d\n”,*p); (5)函數:每一個函數,系統都會分配棧 int fun1(){ int n1 = 200; return n1;
} int fun2(){ int n1; return n1; } int main(){ fun1(); int m = fun2(); printf(“%d\n”,m);
} 主函數分配棧後,執行到fun1,再分配棧,該函數執行完畢後,標記n1被刪除,但是數據被保留;執行到fun2,有標記相同,獲得上一個棧保留的數據;然後,m拷貝數據,輸出m=200. (6)等號由右向左執行 (7)標記刪除(不刪除數據) (8)記憶體機制:數據不會清除,只是覆蓋 (9)註意:寫變數要賦初值 (10)系統分配以及回收記憶體 (11)函數體內創建的變數分配在棧區 int a = 10;//a存放在記憶體的棧區(當出了花括弧則系統回收) 3.堆區 (1)動態記憶體分配, (2)關鍵字malloc ,釋放記憶體free(); (3)由用戶(程式員)分配和回收,如果程式員未回收記憶體,那麼記憶體就會越用越少,有可能導致記憶體不夠用,程式崩潰。如果沒有達到不夠用,程式安然無恙。 (4)當程式退出時,堆記憶體由系統回收(關鍵字free) 4.靜態區(全局區) (1)定義在函數體外面的變數,由系統開闢空間,程式運行過程一直都在,直到程式退出,由系統回收。 (2)變數不定義在任何函數體內 int x = 8;//x存放在靜態區 int main(){ }; (3)特點:①只初始化一次②如果初始化時未賦初值,預設值為0③靜態變數的空間只有程式退出才釋放(程式運行期間永遠存在) (4)目的:①延長變數生命周期②不增大該變數的作用域 (5)關鍵字:static for(int i = 0 ; i < 5 ; i ++){ // int m = 0; static int m = 0;//判斷在靜態區是否存在變數,結果等同於將int m = 0放在for迴圈外面
printf(“%d\n”,m++);
} 5.常量區 (1)常量區的數據存儲在常量區,常量區的內容不可更改 (2)浮點數,整型數,字元數 int a = 10;//10存在常量區 6.代碼區 (1)存放源代碼的編譯區。所有寫的代碼,函數編譯成二進位放在代碼區 (2)所有的語句編譯後生成的CPU指令存儲在代碼區