變數的五大記憶體空間分配

2021-08-19 09:10:03 字數 1111 閱讀 7719

首先,程式變數的記憶體空間有五個:堆疊區(棧區)、堆區、全域性區(靜態區)、**區、文字常量區

1、堆疊區(棧區)

堆疊區是一種老的叫法,由於堆疊區的操作方式和資料結構中的棧是類似(資料先進後出的結構),所以後面很多在稱堆疊區的時候直接叫做棧區,所以其實堆疊區和棧區是乙個意思。 堆疊區是又編譯器自動分配和釋放的,存放的內容是一些區域性變數和函式的引數等。

2、堆區

堆區是自己申請的記憶體空間,c中使用malloc 來進行申請使用,使用delete來進行釋放,c++中使用new/free來進行申請和釋放,其實就是說只有自己去申請的變數才會存再堆區中。

3、全域性區

全域性區也叫靜態區,非常好理解,在函式外的全域性變數的資料存放區域,細化的又分為全域性初始化區和全域性未初始化區,即根據全域性變數有沒有進行初始化進行分類。

4、**區

非常直觀的可以理解為存放**的二進位制資料的區域,這裡可以衍生一下內聯函式為什麼會需要更多的記憶體空間,因為內聯函式會將使用到其自身的地方都進行展開,所以其實增加了**區的記憶體使用。

5、文字常量區

文字常量區即存放一些const申明的變數或者字串常量等

即如果在函式中有 char *p = "abcd";      //p儲存在堆疊區、 「abcd\0」就是儲存在常量區的

注意:在文字常量區的資料是唯讀的,不能對其進行修改,常見的錯誤是關於野指標的:

char *p = "hello world";  // hellow world 是儲存在常量區的字串

*(p+1) = 'w'; //會導致程式崩潰

printf("the p is: %s \n",p);

下面是乙個經典的例子:

inta = 

0;   

//全域性初始化區    

char

char*p1

;   

//全域性未初始化區    

main()      

C語言變數分類和應用以及五大記憶體空間

注意 定義乙個全域性變數後,可以在函式內部重新定義該變數,接下來的程式都使用重新定義的變數,從定義開始起作用。區域性變數和全域性變數同名時,區域性變數會覆蓋全域性變數。eg include int i 9 int main 結果顯示 i 9 i 658291 系統內部的乙個值 不同作用域 scpoe...

五大記憶體分割槽

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...

五大記憶體分割槽

五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式...