首先,程式變數的記憶體空間有五個:堆疊區(棧區)、堆區、全域性區(靜態區)、**區、文字常量區
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分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式...