動態存儲區(堆)、動態存儲區(棧)、靜態存儲區、程序代碼區
動態存儲區(堆):(動態分配)
malloc動態分配在heap堆區。
動態存儲區(堆),程序員自己分配自己釋放。
動態存儲區(棧):(動態分配)
自動變量、const變量在stack棧區。
動態存儲區(棧),系統自動分配釋放。
靜態存儲區:(靜態分配)
extern全局變量,在static靜態存儲區。
靜態存儲區,一旦分配,不會被回收,可讀可寫
程序代碼區:(靜態分配)
main函數、其他函數在code程序代碼區。
程序代碼區,一旦分配,可讀不可寫,不可改變
堆和棧
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 void *p1 = malloc(20); 9 void *p2 = malloc(30); 10 printf("%x,%x\n", &p1, &p2);//地址在棧上 11 printf("%x,%x\n", p1, p2);//在堆區 12 13 system("pause"); 14 }
棧
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<windows.h> 6 7 main() 8 { 9 //堆,不知道要用多少內存的時候,需要手動釋放 10 //堆可以處理很大的內存 11 //堆就是malloc或者realoc或者calloc分配的內存 12 13 while (1) 14 { 15 void *p = malloc(1024 * 1024 * 30); 16 Sleep(2000); 17 free(p); 18 Sleep(2000); 19 } 20 21 system("pause"); 22 }
棧
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 //棧,用完了內存就立刻回收,再次利用 9 10 while (1) 11 { 12 double x[1024 * 50 * 200]; 13 } 14 15 system("pause"); 16 }
