C語言記憶體分割槽,變數的作用域和生存週期

2021-10-17 02:36:58 字數 1186 閱讀 8023

記憶體分為棧區(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語言對全域性變數的缺陷:

如果定義乙個全域性變數,沒有賦值(初始化),無法確定是定義,還是宣告。

如果定義乙個全域性變數同時初始化,這個肯定是定義。

如果宣告乙個全域性變數,建議初始化,如果宣告乙個全域性變數建議加extern關鍵字

分檔案程式設計的時候定義只定義在.c裡定義,標頭檔案用來宣告來防止重複定義。

所有的檔案只能有一次普通函式的定義。

乙個檔案可以有乙個靜態函式的定義

普通函式所有檔案都能呼叫,前提是宣告

靜態函式只能在定義所在的檔案中使用

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迴圈和...