一、內存,,內存
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指令存儲在代碼區