1.1 auto 自動變數
一般情況下**塊內部定義的變數都是自動變數(棧變數)。當然也可以顯示的使用auto關鍵字。
1.2 register 暫存器變數
register int i;
把變數放到
cpu的暫存器裡面
,**執行效率會更高,但取不到變數的位址
(&i會出錯)。
1.3 extern 關鍵字
extern修飾全域性變數glo_var時,表明glo_var可以被其他模組的函式使用。
extern修飾函式是,表明函式可以被其他模組的函式呼叫。
1.4 static關鍵字
static修飾的變數、函式的特點:
1、只初始化一次;
2、生命週期:
從第一次呼叫開始,到main結束(整個程序執行期間有效)。
static修飾區域性變數var時,表明var在函式呼叫結束時不銷毀,到main函式結束時才銷毀。但不能被函式外的其他函式使用。
static修飾全域性變數glovar時,表明glovar不能夠被其他模組的函式使用,只能在本模組中應用,到main函式結束時銷毀;
static修飾函式,表明函式不能夠被其他模組的函式呼叫;
1.5 voltile 關鍵字
volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。
參考:
2.1 **區
**區code,程式被作業系統載入到記憶體的時候,所有的可執行**都載入到**區,也叫**段,這塊記憶體是不可以在執行期間修改的。
2.2 靜態區
所有的全域性變數以及程式中的靜態變數都儲存到靜態區。
2.3 棧區
棧stack,所有的自動變數,函式的形參都是由編譯器自動放出棧中,當乙個自動變數超出其作用域時,自動從棧中彈出。
2.4 堆區
堆heap和棧一樣,也是一種在程式執行過程中可以隨時修改的記憶體區域,但沒有棧那樣先進後出的順序。
堆是乙個大容器,它的容量要遠遠大於棧,但是在c語言中,堆記憶體空間的申請和釋放需要手動通過**來完成。
2.5 堆的分配和釋放
三個堆記憶體分配函式: 1、
void* malloc(unsigned size);
char* p;常見陷阱1:p=(char*)malloc(size);
malloc用於申請一段新的位址,引數size為需要記憶體空間的長度。
malloc不能初始化所分配的記憶體空間,需呼叫函式memset自行初始化。
常見陷阱2:
解決方案之二級指標:
與malloc相似,引數sizeofelement為申請位址的單位元素長度,numelements為元素個數,即在堆記憶體中申請numelements*sizeofelement位元組大小的連續位址空間。
calloc() 會將所分配的記憶體空間中的每一位自動初始化為零。
動態陣列:
realloc是給乙個已經分配了位址的指標重新分配空間,引數ptr為原有的空間位址,newsize是重新申請的位址長度。
當縮小記憶體空間時:被縮小的那一部分的內容會丟失。
當擴大記憶體空間時:realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平;如果資料後面的位元組不夠,那麼就使用堆上第乙個有足夠大小的自由塊,現存的資料然後就被拷貝至新的位置,而老塊則放回到堆上.這句話傳遞的乙個重要的資訊就是資料可能被移動。
C語言記憶體分割槽,變數的作用域和生存週期
記憶體分為棧區 stack 堆區 heap 全域性區 靜態區 data區 區 text segment 四個區。而每乙個記憶體分割槽,又起著不同的作用。區 text segment 載入的是可執行檔案 段,所有的可執行 都載入到 區,這塊記憶體是不可以在執行期間修改的。作用域 就是變數的範圍 生命週...
C語言程序的記憶體分割槽 變數作用域和生存期
c源 進過預處理 編譯 彙編和鏈結4步生成乙個可執行程式。程式在沒有執行之前,也就是說程式沒有被載入到記憶體前,可執行程式內部已經分好3段資訊,分別是 區 text 資料區 data 和未初始化資料區 bss 三個部分。部分人直接把data和bss合起來叫做靜態區或全域性區 執行可執行程式,系統把程...
C 記憶體模型 作用域和鏈結
作用域 scope 描述了在檔案 翻譯單元 的多大範圍可見。鏈結性 linkage 描述了名稱如何在不同單元間共享。鏈結性為外部的名稱可在檔案間共享,鏈結性為內部的名稱只能由乙個檔案中的函式共享。1 自動變數只在包含它們的函式或 塊中可見。闡明自動變數的範圍 includevoid oil int ...