#include<stdio.h> #include<stdlib.h> //程序代碼指令,define定義的常量---代碼區(只讀) //全局(關鍵)變量/常量,靜態(關鍵)變量/常量,常量字符串---靜態區 //靜態區的內容在總個程序的生命周期內都存在,由編譯器在編譯的時候分配。 //局部變量---棧區 //棧區上的內容只在函數的范圍內存在,當函數運行結束,這些內容也會自動被銷毀。其特點是效率高,但空間大小有限。 //由malloc或者realoc,calloc分配的內存區域---堆區 //堆區其生命周期由free決定。 #define PI 3.14 // //全局變量 int a = 10; int b[5] = { 1, 2, 3, 4, 5 }; int const c = 2; void run2(); void main(){ int num = 10; //對於int num = 10;的理解 //int 數據類型 編譯器預算對象(變量)num分配4個字節內存空間大小 //num是內存中一段內存空間的標識(相當於門牌號), //10 才是存儲在這段內存空間里的數據 //詳細的來說,“int num=10;”這段字符存儲在代碼區,數據10存儲在棧區 //驗證局部常量是否存儲在棧區 run2(); //經過內存觀察,開始局部常量cde的內存空間的數據是2 //當run2()函數執行完畢,局部常量cde的內存空間的數據發生變化 //因為靜態區的內容在總個程序的生命周期內都存在,所以判斷局部常量存儲在棧區 char *p = "asdfadsf";//"asdfadsf"是字符串常量,在靜態區,只讀 //指針p是臨時變量,在棧區 //驗證 "asdfadsf" 只讀 //*p = 'a';//編譯不報錯 printf("%s\n", p);//運行報錯--“寫入位置 0x001B692C 時發生訪問沖突。”,由此證明"asdfadsf"是字符串常量,只讀 //堆只能是malloc或者realoc,calloc,分配的內存才是堆 //例如以下代碼 void *p1 = malloc(sizeof(int)* 1024);//malloc(sizeof(int)* 1024);分配的內存就是堆區,但是指針p1是在棧區 //堆的使用情況:①無法確定需要內存的大小;②需要的內存很大 //堆的注意點:堆和棧不同,堆的內存大小是由程序員分配的,必須由程序員手動釋放(free(p1);); //對於棧來說,棧的內存大小由系統分配(棧的極限大約是1M,非常小),所以棧的內存空間是由系統回收的 //堆的內存大小是由程序員分配的,理論上可以占據系統中所有的內存(甚至能搶占棧的內存空間) //因為棧的內存空間是由系統回收的,所有在回收的時候會消耗大量的cpu char d = 'a';//變量d的數據在棧區中 system("pause"); } //run1是程序代碼,所以存儲在代碼區 void run1(){ while (1){ int x = 0;//x變量的內存空間在棧區,因為while循環,x每次循環都會初始化,所以系統不斷的在棧上創建x的內存空間,回收x的內存空間,會消耗大量的cpu printf("%d", x); } } void run2(){ const cde = 2;//變量cde的數據在棧區,與cde是否是常量沒關系 printf("%x\n",&cde);//獲取cde的地址,檢測run2()函數在main()執行完成之后,系統是否會回收cde指向的內存空間 } int add(int a, int b){//形參a,b是臨時變量,形參a,b的數據存儲在棧區 return a + b;//a+b的操作會在寄存器中執行 }