一、幾個基本概念
1.變量
1.全局變量(外部變量):出現在代碼塊{}之外的變量就是全局變量。
2.局部變量(自動變量):一般情況下,代碼塊{}內部的變量就是自動變量,也可使用auto顯示定義。
3.靜態變量:指內存位置在程序執行期間一直不改變的變量,用關鍵字static修飾。代碼塊內部的靜態變量只能被這個代碼塊內部訪問,代碼塊外部的靜態變量只能被定義這個變量的文件訪問。
2.作用域
通常指的是變量的作用域,廣義上講,有函數作用域和文件作用域。
二、內存四區
計算機中的內存是分區來管理的,程序和程序之間的內存是獨立的,不能互相訪問的,比如QQ和瀏覽器分別所占的內存區域是不能相互訪問的。而每個程序的內存也是分區管理的,一個程序所占
的內存空間可以分為很多個區域,我們需要了解的內存主要有四個區域,通常叫內存四區。
1.代碼區
程序被操作系統加載到內存時,所有的可執行代碼(程序代碼指令、常量字符串等)都加載到代碼區,這塊內存在程序運行期間是不變的。代碼是平行的,里面裝的是一堆指令,在程序運行期間
是不能改變的。函數也是代碼的一部分,故函數都被放在代碼區,包括main函數。
注意:"int a = 0;"語句可拆分成"int a;"和"a = 0",定義變量a的"int a;"語句並不是代碼,它在程序編譯時就執行了,並沒有放到代碼區,放到代碼區的只有"a = 0"這句
2.靜態區
靜態區存放程序中所有的全局變量和靜態變量
3.棧區
棧(stack)是一種先進后出的內存結構,所有的自動變量、函數形參都存儲在棧中,這個動作由編譯器自動完成,我們寫程序時不需要考慮。棧區在程序運行期間是可以隨時修改的。當一個自動變
量超出其作用域時,自動從棧中彈出。
每個線程都有自己專屬的棧;
棧的最大尺寸固定,超出則引起棧溢出;
變量離開作用域后棧上的內存會自動釋放。
4.堆區
堆(heap)和棧一樣,也是一種在程序運行過程中可以隨時修改的內存區域,但沒有棧那樣先進后出的順序。更重要的是堆是一個大容器,它的容量要遠遠大於棧,這可以解決上面實驗三造成的內存溢出困難。一般比較復雜的數據類型都是放在堆中。但是在C語言中,堆內存空間的申請和釋放需要手動通過代碼來完成。對於一個32位操作系統,最大管理管理4G內存,其中1G是給操作系統自己用的,剩下的3G都是給用戶程序,一個用戶程序理論上可以使用3G的內存空間。堆上的內存必須手動釋放(C/C++),除非語言執行環境支持GC(如C#在.NET上運行就有垃圾回收機制)。
使用malloc和free來進行對空間的操作