C 作用域 記憶體分割槽的彙總

2021-07-03 00:09:03 字數 2600 閱讀 2048

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; 

p=(char*)malloc(size); 

malloc用於申請一段新的位址,引數size為需要記憶體空間的長度。 

malloc不能初始化所分配的記憶體空間,需呼叫函式memset自行初始化。

常見陷阱1: 

常見陷阱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 ...