記憶體分為棧區(stack),堆區(heap),全域性區(靜態區)(data區),**區(text segment)四個區。而每乙個記憶體分割槽,又起著不同的作用。
**區(text segment):載入的是可執行檔案**段,所有的可執行**都載入到**區,這塊記憶體是不可以在執行期間修改的。
作用域:就是變數的範圍
生命週期:就是變數的有效期
#include
intmain()
printf
("我是外面的a:%d\n"
, a)
;return
0;
void
static_fun()
intmain()
普通區域性變數和靜態區域性變數區別:
記憶體分配和釋放
初始化
在{}外面(函式外面)定義的變數為全域性變數。
只有定義了全域性變數,任何地方都能使用此變數。
如果使用變數時,在前面找不到此全域性變數的定義,需要宣告才能使用。
全域性變數不初始化,預設賦值為0。
宣告只針對全域性變數,不針對宣告多次。
全域性變數在編譯階段已經分配空間,程式結束,自動釋放。
全域性變數只能定義一次,可以宣告多次。
不同檔案,普通全域性變數只能定義一次,可以宣告多次。
void
static_fun()
int i =1;
//全域性變數定義在下面
intmain()
c語言對全域性變數的缺陷:分檔案程式設計的時候定義只定義在.c裡定義,標頭檔案用來宣告來防止重複定義。如果定義乙個全域性變數,沒有賦值(初始化),無法確定是定義,還是宣告。
如果定義乙個全域性變數同時初始化,這個肯定是定義。
如果宣告乙個全域性變數,建議初始化,如果宣告乙個全域性變數建議加extern關鍵字
所有的檔案只能有一次普通函式的定義。
乙個檔案可以有乙個靜態函式的定義
普通函式所有檔案都能呼叫,前提是宣告
靜態函式只能在定義所在的檔案中使用
C語言程序的記憶體分割槽 變數作用域和生存期
c源 進過預處理 編譯 彙編和鏈結4步生成乙個可執行程式。程式在沒有執行之前,也就是說程式沒有被載入到記憶體前,可執行程式內部已經分好3段資訊,分別是 區 text 資料區 data 和未初始化資料區 bss 三個部分。部分人直接把data和bss合起來叫做靜態區或全域性區 執行可執行程式,系統把程...
C 作用域 記憶體分割槽的彙總
1.1 auto 自動變數 一般情況下 塊內部定義的變數都是自動變數 棧變數 當然也可以顯示的使用auto關鍵字。1.2 register 暫存器變數 register int i 把變數放到 cpu的暫存器裡面 執行效率會更高,但取不到變數的位址 i會出錯 1.3 extern 關鍵字 exter...
C語言變數作用域
作用域描述程式中可訪問識別符號的區域。乙個c變數的作用域可以是塊作用域,函式作用域,函式原型作用域或檔案作用域。int fun int a q作用域結束 在這個例子中,q的作用域只在內層塊,只有內層塊中的 才能訪問q。在c99中,把塊的概念擴充套件到for迴圈,while迴圈,do while迴圈和...