乙個c語言變數的作用域可以是**塊 作用域,函式作用域或者檔案作用域
**塊是{}之間的一段**
同乙個**塊不可以有重名變數
auto自動變數
一般情況下**塊內部定義的變數都是自動變數
也可以顯示的使用aotu關鍵字
register暫存器變數auto
int i;
通常變數在記憶體當中,如果能把變數放到cpu的暫存器裡面,**執行效率會更高
暫存器變數存在於cpu,沒有記憶體位址,不可以取位址(&)
static靜態變數register
int i;
預設初始化為0
static變數在程式一開始時候載入到記憶體就已經存在,static初值只初始化一次
區域性的靜態變數static
int i =
0;
靜態變數是指記憶體位置在程式執行期間一直不改變的變數,乙個**塊內部的靜態變數只能被這個**塊內部訪問
全域性的靜態變數
**塊之外的靜態變數在程式執行期間一直存在,但只能被定義這個變數的檔案訪問
全域性變數
預設初始化為0
全域性變數在程式載入時候就存在,一直到程式退出才銷毀
全域性變數的儲存方式和靜態變數相同,但可以被多個檔案訪問(extern)
外部變數與extern關鍵字
全域性函式與靜態函式extern
int i;
在c語言中函式預設都是全域性的,使用關鍵字static可以將函式宣告為靜態
記憶體分割槽可以大概分為四個區,**區,靜態區,棧區,堆區
**區**區code,程式被作業系統載入到記憶體的時候,所有的可執行**都載入到**區,也叫**段,這塊記憶體是不可以在執行期間修改的
存放程式**指令,常量字串
不可讀寫,只可以執行
**區的位址可以通過函式指標來訪問
靜態區所有的全域性變數以及程式中的靜態變數都儲存到靜態區,比較如下兩段**的區別
存放全域性變數/常量和靜態變數/常量
int a =0;
intmain()
棧區int a =0;
static
int b =0;
intmain()
棧stack是一種先進後出的記憶體結構,所有的自動變數,函式的形參都是由編譯器自動放出棧中,當乙個自動變數超出其作用域時,自動從棧中彈出
存放所有的自動變數,包括函式的形參都放到棧區
棧頂指標從高位向地位遞減
c語言中,函式引數從右到左入棧
棧空間不可以定義可變陣列,其原因是棧空間大小在編譯時候就要確定
堆區程式可以自由的在堆中存放任何變數
堆heap和棧一樣,也是一種在程式執行過程中可以隨時修改的記憶體區域,但沒有棧那樣先進後出的順序。
堆是乙個大容器,它的容量要遠遠大於棧,但是在c語言中,堆記憶體空間的申請和釋放需要手動通過**來完成
malloc
使用關鍵字malloc可以在堆記憶體中開闢儲存空間,一般使用memset將記憶體清零
注:在使用malloc開闢記憶體使用完成後,必須使用free釋放開闢的記憶體malloc
(1024);
memset
(p,0
,1024
);
callocint
*p =
(int*)
malloc
(sizeof
(int))
;···
free
(p);
第乙個引數是所需記憶體單元數量,第二個引數是每個記憶體單元的大小(單位:位元組),calloc自動將分配的記憶體置0int
*p =
(int*)
calloc
(100
,sizeof
(int))
;//分配100個int
realloc
用於記憶體的大小改變,自動釋放原記憶體,儲存新記憶體
int
*p =
(int*)
malloc
(1024);
memset
(p,0
,1024);
···p =
realloc
(p,2048
);
realloc
(null
,1024);
//等價於
malloc
(1024
);
C 學習筆記 6 C 記憶體管理
3 堆和棧的區別 4 記憶體的申請和釋放 5 malloc free與new delete 參考資料 內存在程式編譯的時候就已經分配好了,這塊內存在程式的整個執行期間都存在。例如全域性變數,static靜態成員變數 執行函式時,函式內部變數的儲存單元可以在棧上建立,函式執行結束時這些儲存單元自動釋放...
uC GUI學習筆記 記憶體管理
與uc os記憶體管理相似,ucgui也存在類似儲存控制塊的結構,不過它不叫記憶體控制塊,而叫記憶體分配資訊節點 或叫記憶體管理單元 方便起見,我們暫且也將其稱為儲存控制塊。儲存控制塊以陣列形式存在,同時也構成雙向鍊錶,而ucos中的儲存控制塊則是單向鍊錶。與ucos記憶體管理剛好相反,在ucos中...
WinApi學習筆記 記憶體管理
每個程序都有乙個私有的虛擬位址空間 系統將每個程序的虛擬位址空間對映到物理記憶體上 為了實現每個程序都有乙個私有的虛擬位址空間系統為每個程序都建立了乙個頁目錄和一組頁表 每個程序的頁表是獨立的 而核心空間的頁表是所有程序共享的 x86平台上有乙個cr3暫存器,該暫存器儲存當前執行的程序的頁目錄位址 ...