全域性變數和區域性變數在記憶體中的區別

2021-08-16 17:55:46 字數 828 閱讀 7220

答:有區別。全域性變數儲存在記憶體的全域性儲存區中,占用靜態的儲存單元;區域性變數儲存在棧中,只有在所在函式被呼叫時才動態地為變數分配儲存單元。

該題目考查的知識點是變數的儲存型別及性質。c語言經過編譯之後將記憶體分為以下幾個區域:

(2)堆(heap):用於程式動態申請分配和釋放空間。c語言中的malloc和free,c++中的new和delete均是在堆中進行的。正常情況下,程式設計師申請的空間在使用結束後應該釋放,若程式設計師沒有釋放空間,則程式結束時系統自動**。注意:這裡的「堆」並不是資料結構中的「堆」。

(3)全域性(靜態)儲存區:分為data段和bss段。data段(全域性初始化區)存放初始化的全域性變數和靜態變數;bss段(全域性未初始化區)存放未初始化的全域性變數和靜態變數。程式執行結束時自動釋放。其中bbs段在程式執行之前會被系統自動清0,所以未初始化的全域性變數和靜態變數在程式執行之前已經為0。

(4)文字常量區:存放常量字串。程式結束後由系統釋放。

(5)程式**區:存放程式的二進位制**。

顯然,c語言中的全域性變數和區域性變數在記憶體中是有區別的。c語言中的全域性變數包括外部變數和靜態變數,均是儲存在全域性儲存區中,占用永久性的儲存單元;區域性變數,即自動變數,儲存在棧中,只有在所在函式被呼叫時才由系統動態在棧中分配臨時性的儲存單元。

有興趣的讀者可以執行下面的程式,分析一下執行結果。

#include 

#include

int k1 = 1;

int k2;

static int k3 = 2;

static int k4;

int main( )

全域性變數和區域性變數在記憶體中的區別

static函式和普通函式區別作用域記憶體儲存數量 關於變數訪問速度的相關備忘 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等 操作方式類似於資料結構中的棧 2 堆區 heap 由程式設計師分配釋放,如果不釋放可能由os 但區別與資料結構中的堆,其分配方式類似於鍊錶 ...

全域性變數和區域性變數在記憶體裡的區別?

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...

全域性變數和區域性變數在記憶體裡的區別?

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...