C語言(九) 深度剖析資料在記憶體中的儲存 (下)

2021-08-15 19:41:07 字數 1932 閱讀 2484

今天我們繼續來學習資料在記憶體中的儲存;

c/c++程式記憶體的分配

乙個由c/c++編譯的程式占用的記憶體分別為一下幾個部分:

1、棧區(stack)---- 由編譯器自動分配釋放,存放為執行函式而分配的區域性變數、函式引數、返回資料、返回位址等。其操作方式類似於資料結構中的棧。

2.   堆區(heap)---- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。分配方式類似於鍊錶。

3.   全域性區(靜態區) (static)---- 存放全域性變數、靜態資料、常量。程式結束後由系統釋放。

4.   文字常量區 ---- 常量字串就是放在這裡的。程式結束後由系統釋放。

5.   程式**區 ---- 存放函式體 (類成員函式和全域性函式)的二進位制**。

記憶體分配有三種方式:

1、從靜態儲存區域分配

內存在程式編譯的時候就已經分配好了,這塊內存在程式的整個執行期間都存在。例如全域性變數、static變數。

2、在棧上建立

在執行函式時,函式內部變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動釋放。棧記憶體分配

運算內置於處理器的指令集中,效率高,但是分配的內容量有限。

3、從堆上分配

亦稱動態記憶體分配

程式在執行的時候用malloc或new申請任意多少記憶體,

程式設計師自己負責在何時使用free或delete釋放記憶體。

變數的儲存位置

普通儲存

執行時堆疊

硬體暫存器

變數的預設儲存型別取決於它的申明位置

1.凡是在任何**塊之外的宣告的變數總是儲存於靜態記憶體中。

不屬於堆疊記憶體,這類變數稱為靜態變數。講台變數在函式執行之前建立。

2.在**塊內部宣告的變數預設儲存型別是自動的。

儲存於堆疊中

3.對於在**塊內部宣告的變數,如果給他加上static關鍵字,可以是它的儲存型別由自由轉變為靜態。

具有靜態儲存型別的變數在整個程式執行過程中一直存在。

注意:修改變數的儲存型別並不修改變數的作用域,它只能在該**塊內部按名字訪問。

4.暫存器變數:register關鍵字

變數的初始化:

如果不顯示的初始化,靜態變數的說出實話為0,二自動變數是不做任何初始化的,是隨機值。

static總結:1. 當它作用於函式定義時,或者用**塊之外的變數宣告時,static關鍵字用於修改識別符號的鏈結屬性。外部鏈結屬性變為內部 鏈結屬性,識別符號的儲存型別和作用於不變。也就是說變數或者函式只能在當前原始檔中訪問。不能再其他原始檔中訪問。

2.當它用於**塊內部時,static關鍵字用於修改變數的儲存型別。從自動變數變為靜態變數。變數的屬性和作用於不受影響。

static ----  修飾區域性變數

生命週期:生命週期是整個程式的生命週期

作用域:區域性作用域

儲存位置:靜態區

static ---- 修飾全域性變數

static修飾的鏈結屬性只能在當前原始檔使用

static ---- 修飾函式

static修飾的鏈結屬性只能在當前原始檔使用

深度剖析資料在記憶體中的儲存

我們要想知道資料如何在記憶體中的儲存,就必須先談談資料型別的意義 1 如果我們把記憶體看成乙個個房間,那麼資料型別就決定了房間號和房間大小,這樣應該很好理解了吧 接下來我們來談談資料型別的分類 1 整形家族 char 有符號字元型,只不過把signed省略了 unsigned char 無符號型別字...

剖析資料在記憶體中的儲存

乙個變數的建立是要在記憶體中開闢空間的,空間的大小是根據及不同的型別所決定的。在討論資料在所開闢記憶體中是如何儲存的之前要了解以下概念。例 答案 1,1,255 解析 首先要進行整形提公升,提公升時,要看自己的型別,有符號新增 1 無符號則新增 0 要看變數的型別 確定是否有符號位 若為無符號位,直...

深度剖析資料在記憶體中的儲存(整型和浮點型)

我們知道乙個變數的建立是要在記憶體中開闢空間的,空間的大小是根據不同的型別而決定的,而且不同的型別也影響著我們看待記憶體空間的視角。比如 int a 20,float b 5.0 接下來我們看看資料在所開闢的型別中是如何儲存的?整型家族 char unsigned char,signed char ...