【C/C++教學】關於C/C++中各個區域內存的劃分,你知道多少?

有話先說程序員


咱們都知道,web

一個程序是由代碼數據構成的。微信

其中代碼是放在代碼區,函數

而數據根據類型和功能  的不一樣,大數據

又放在不一樣的區域。url

那麼關於這些區域是怎麼劃分的呢?spa

今天帶你一探究竟。操作系統



01.net

代碼區3d

顧名思義,

代碼區就是存儲程序代碼的區域。

例以下面的程序:

像run()函數,

main()函數這些,

以及printf()這些可執行的代碼

都是丟到了代碼區。

值得注意的是代碼區是只讀的,

不可寫




02

棧區是由編譯器在須要的時候分配,

用完會自動清除的一個區域,

一般這個區域存放的是

一些局部變量以及函數的參數等,

棧區的大小通常由編譯器決定,

效率比較高,

但空間比較有限。

例以下面的程序:




像其中func函數中的變量a,變量b,

main函數裏面的變量val

                            等局部變量

以及調用func函數傳入的參數200等,

這些都是存放在棧區的,

存入棧區的變量

會在代碼塊執行完以後清除。

同窗們也能夠思考一下:



爲何這裏不斷循環,

執行int a = 0;

但編譯器沒有提示重定義的錯誤。

而這個:

            編譯器會提示變量a重定義了

這裏用棧自動清除的特性就很容易解釋了,

定義在大括號裏面的變量a

是一個局部變量,

for每循環一次,

就執行下面大括號裏面的內容一次,

等執行完了整個大括號的內容,

棧自動清除局部變量a,

因爲a已經被清除,

下一次循環時再定義a天然不會有問題。

而下面連續在同一代碼塊

定義多個同名變量,

編譯器天然給你一個CE了。




03

堆區


前面說的,

棧區是放局部變量的區域,

大小有限。

那麼實際開發中,

要從硬盤中加載一個幾GB的大數據文件,

用到更多的內存空間時怎麼辦?

這時候你就能夠用到堆區了!

堆區是由程序員手動申請的,

伴隨整個程序運行週期都有效的,

一塊內存區域。

堆區的釋放編譯器可不會管,

須要手動釋放的。

若是沒有釋放掉,

那麼只有程序結束時,

操做系統纔會自動回收。

C語言中,

能夠用malloc函數來申請堆區的內存。

例以下面的程序:



 malo函數結束後,

經過malloc申請的100個字節的內存

並不會被回收,

這一塊內存則是從堆區中申請的。

說到這裏,

有些邪惡的小夥伴可能已經想到了,

能夠來個死循環,

而後不斷申請內存,

最終卡死電腦。

 




04

全局/靜態存儲區

這一塊區域主要用來,

存儲程序的靜態變量以及全局變

先於main函數以前分配

是伴隨整個程序的生命週期都存在的。

例以下面的例子:


值得一提的是,

字符串常量也是放在靜態區的。

從這一點上來講,

咱們又能夠稱字符串常量爲無名的靜態變量。


尾聲

看了上面的介紹

是否是對內存區域的劃分更加清楚了呢

是否是以爲本身的肚子裏的墨水又多了呢

小編以爲答案毋庸置疑了>-<


那還等什麼~

快點來關注並加入咱們

增加本身的 姿式水平 吧~~~

走過路過,不要錯過這個公衆號哦!

點擊藍字

關注咱們

編輯:onemy

(微信:xiaoshiyisss)

排版:Summer 

(微信:hxh2421982051)

公衆號:程序猿聲



本文分享自微信公衆號 - 程序猿聲(ProgramDream)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索