關於c語言的變數儲存及記憶體分配

2021-07-03 13:52:42 字數 1457 閱讀 2603

在計算機裡面,cpu與磁碟(硬碟)是不直接發生資料交換的,因為cpu處理資料的速度遠大於磁碟的速度,因此,在cpu與磁碟之間就有了記憶體這東西的出現,記憶體就是起著乙個緩衝的作用,當執行程式的時候,首先的從磁碟把程式載入到記憶體,然後cpu才能從記憶體裡面取指令以及傳輸資料。但是記憶體是掉電之後裡面的資料就會丟失,而磁碟裡面的資料會一直存在的,因此,當你關機之後,記憶體就會被清空,下次開機的時候重將系統程式從磁碟載入到記憶體,然後再執行。這種每次斷電之後開機都會重新從磁碟載入系統程式到記憶體的方法明顯影響了開機的速度,因此現在人們想出了一種辦法在斷電之後仍能保證記憶體的資料不會丟失的辦法,那就是斷電之後仍然給記憶體供極少的電量來保證記憶體的資料不會丟失,著就是所謂的低功耗。當下次開啟電腦的時候,系統載入會很快。

剛才說了內存在程式執行過程中不可缺少,下面來看看編譯器都是怎麼來把整個記憶體進行分配的。

我們編寫的c語言源**(文字檔案或者叫ascii檔案)必須要轉換成機器所能識別的二進位制檔案,計算機才能進行運算,因此,原始碼先經過彙編->編譯之後形成二進位制檔案,然後是將編譯器提供的各個二進位制源**連線起來形成乙個整體的二進位制檔案。 一

、在上訴過程中編譯器會在記憶體中分出幾個段,分別是:

**段:**段用來儲存載入到記憶體的二進位制**。cpu從裡面取指令。

資料段:資料段細分為三段:

1、已初始化讀寫資料段:主要存放宣告並有初值的全域性變數和加了static關鍵字的區域性變數,它們的值都是可以改變的。

2、未初始化資料段bss:主要存放的是未初始化的全域性變數和加了static關鍵字的未初始化區域性變數。

3、唯讀資料段:該資料段主要是儲存程式中的常量資料(內容是不能改變的),一般所稱的常量區就是指該資料段。

變數或者常量在上訴幾個記憶體段中分配好之後,在整個程式執行過程中都有效,生命週期從建立到整個程式執行結束才釋放,我們稱之為

靜態儲存區。

三、初始化完成之後程式

應該要執行了,在執行的過程中會在分出兩個段:

堆:主要是提供給程式猿用malloc()函式動態分配需要的記憶體大小的。

棧:主要是分配函式裡面的未加static關鍵字的區域性變數和函式的行參的。

這兩個段是在程式執行的過程中動態分配的,當呼叫函式的時候為其行參和未加static的區域性變數分配記憶體,當函式呼叫結束記憶體釋放,我們稱為

動態儲存區。

註明:全域性變數加關鍵字static只是

影響該變數的作用域

,加上了就只能在該文字檔案裡面用,而不能在其他檔案裡面使用該變數。不會影響其儲存位置,有無關鍵字都是儲存在靜態儲存區裡面的。但是區域性變數若加了static則會將該變數儲存在靜態儲存區裡面,不加應該是在動態儲存區棧裡面的,只是影響了儲存位置,不會影響其作用域。

補充:全域性變數是在編譯的過程中就在靜態儲存區裡面分配記憶體的,而區域性變數則是在程式執行過程中動態分配記憶體的。

記憶體分配例項:

C語言中關於記憶體的分配

在編寫c語言程式時,我們的記憶體儲存在4塊區域,分別為棧 stack 堆 heap 資料區 data和.bss區域 常量區 唯讀 棧 棧區域中存放的是區域性變數,函式定義的形參,和auto修飾的自動變數。特點 1 棧空間是os 作業系統 自動分配和 程式設計師不用去管 2 棧空間可以被反覆使用 3 ...

C語言記憶體分配及各種資料儲存位置

指標的使用,一直是c語言面試題中必考的部分,因為指標本身使用的複雜性與普適性,所以考點非常多,而且也可以與其他知識相互結合,因此我們將會使用五篇專題的篇幅來介紹指標。分析下面的程式,指出程式中的錯誤 cpp view plain copy include intmain void 沒有正確為str分...

c語言動態分配記憶體及記憶體分配部分函式

include 在c中動態分配記憶體的基本步驟有 1,用malloc類的函式分配記憶體 2,用這些記憶體支援應用程式 3,用free函式釋放記憶體 二 動態記憶體分配函式 malloc 從堆上分配記憶體 realloc 在之前分配的記憶體塊的基礎上,將記憶體重新分配為更大或者更小的部分 calloc...