内存四区
每一個應用程序,都有自己的內存空間。例如程序1有程序1的內存空間,程序2有程序2的內存空間,程序1不能訪問程序2的內存空間,程序2也不能訪問程序1的內存空間。假設錢包是內存,錢包里面的錢是內存中的數據。你不能用別人的錢,因為別人的錢不是你的錢,反過來別人也不能用你的錢,因為你的錢是你個人私有的;而你的錢又分為十元錢,二十元錢,五十元錢,一百元錢,不同面值的錢放在錢包不同的夾層里面,十元錢放在十元錢夾層里面,二十元錢放在二十元夾層里,五十元錢放在五十元夾層里,一百元錢放在一百元夾層里;如果你不加以區分,所有的錢都放在一個夾層里面,是不是很亂呢,我需要五十塊錢買東西,直接在五十元夾層里拿就好了,比起將整個錢包翻一遍要快速方便的多。內存也是一樣的道理。錢包有四個夾層,而內存也有四個區,不同的區存放不同的數據。
棧區:
棧(stack),是一種先進后出的內存結構,所有的局部變量、函數的形參都是放入棧中,當一個局部變量超出其作用域時,自動從棧中彈出。
棧區存放的是局部變量。
存放在棧區的數據,可以在程序運行期間隨時修改。
對與局部變量,什么時候入棧,什么時候出棧,是不需要程序控制的,由編譯器控制。而堆則相反。
堆區:
堆(heap)和棧一樣,也是一種在程序運行期間隨時可以修改的內存區域,但沒有棧那樣先進后出的順序。
堆是一個大容器,它的容量要遠遠大于棧,但是在C/C++中,堆內存空間需要手動的分配及釋放(C語言通過malloc函數分配堆內存,通過free函數釋放。C++語言通過new關鍵字分配堆內存,通過delete關鍵字釋放)。
?
靜態區:
靜態區存放的是:全局變量、全局靜態變量、局部靜態變量。
代碼區(code):
程序被操作系統加載到內存的時候,所有的可執行代碼都加載到代碼區,也叫代碼段,這塊內存是不能在程序運行期間修改的。
代碼區存放的是程序的所有可執行代碼。
void main() {int i;i = 0;cout << ++i << endl; }int i; 這句話不是可執行代碼,所以不會放入代碼區。而是放入棧區,因為i是定義一個局部變量。
除了int i; 這句代碼意外,所有的代碼都將放入代碼區。
看一段代碼:
1 #include <iostream> 2 using namespace std; 3 4 int c; 5 void OutPut(const int *p1, const int *p2) 6 { 7 cout << hex << p1 << "\t" << p2 << endl; 8 } 9 int main() 10 { 11 int a; 12 int b; 13 static int d; 14 int *p1 = new int; 15 char *p2 = new char; 16 17 OutPut(&a, &b); 18 OutPut(&c, &d); 19 cout << "p1 = " << p1 << "\tp2 = " << hex << (int)p2 << endl; 20 cout << "main = " << main << "\tOutPut = " << OutPut << endl; 21 22 delete p1; 23 delete p2; 24 25 getchar(); 26 return 0; 27 }假設:
a的地址 = 0016F738 b的地址 = 0016F72C
c的地址 = 01235510 d的地址 = 01235518
p1的地址 = 005CA0B0 ?p2的地址 = 005CA010
main的地址 = 0122150F OutPut = 0122125D
請問,變量a、b、c、d、p1、p2、p1指向的內存、p2指向的內存、main函數、OutPut函數都在區?
?
?
?
?
?
答:變量a、b在棧區
c,d在靜態區
p1,p2在棧區
p1指向的內存、p2指向的內存在堆區
main函數、OutPut函數在代碼區
?
轉載于:https://www.cnblogs.com/LandyTan/p/6400549.html
總結
- 上一篇: BZOJ 1662: [Usaco200
- 下一篇: java面向对象之父类的引用指向子类的对