C 堆記憶體(一)

2021-10-08 08:10:41 字數 1589 閱讀 6282

**段(text):

儲存著程式的二進位制指令和常量資料,該區的許可權為唯讀,這部分區域的大小在程式執行前就已經確定,所以強行修改它會產生錯誤

靜態資料段(bss):

儲存沒初始化過的全域性變數和靜態變數,程式每次執行前都會將該區域清零。

資料段(data):

存放初始化過的全域性變數和靜態變數

棧:

存放著區域性變數和塊變數。該區域是由系統管理開闢和釋放,隨著函式的呼叫分配記憶體,同時該區域大小有限,超出棧記憶體會產生棧溢位或者段錯誤的警告。

堆:

堆和棧是相反的概念。堆是由程式設計師自己申請自己管理和釋放的記憶體,堆的大小理論上是計算機物理記憶體的極限。雖然很大,但是操作不當會讓系統奔潰。所以相對於堆,棧更安全。

隨著程式結構變得複雜,計算機硬體的更新換代,棧的大小滿足不了許多專案對記憶體的需求,又因為堆記憶體很大,又受我們的控制,所以堆記憶體開始擔大旗。

堆記憶體的申請:

函式原型: void *malloc(size_t,size);

功能:從堆記憶體中申請大小為size的記憶體,但是申請的記憶體中儲存什麼內容不確定。

返回值:成功返回申請到的記憶體的首位址,失敗則返回null

int

*arr=

malloc

(sizeof

(int

)*size)

;

size 是你想申請的空間大小,size為5,就申請5個大小為4位元組的連續的記憶體空間,在vs中因為**審查更嚴格所以要強轉成int*型別的返回值

釋放堆記憶體:

free

(arr)

;arr=

null

;

申請多塊堆記憶體:void *calloc(size_t nmemb, size_t size);

功能:從堆記憶體中申請nmemb塊size個位元組的記憶體,申請的記憶體塊會被初始化為0。

注意:申請的依然是一塊連續的記憶體。

arr=

calloc(5

,10);

調整堆記憶體:void *realloc(void *ptr, size_t size);

功能:改變已經有記憶體塊的大小,在原有的基礎上調大或調小。

返回值:是調整後的記憶體塊的首位址,一定要重新接收返回值,可能不是在原內塊上調整的。

如果無法在原記憶體塊上進行調整:

1、申請一塊新的符合要的記憶體塊

2、把原記憶體塊上的內容拷貝過去

3、把原記憶體釋放掉返回新記憶體塊的首位址

arr=

realloc

(arr,30)

;

C 棧 堆記憶體

由編譯器自動分配釋放 存放函式引數值,區域性變數值等。其操作方式類似於資料結構中棧。一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中堆是兩回事,分配方式倒是類似於鍊錶,呵呵。全域性變數和靜態變數儲存是放在一塊,初始化全域性變數和靜態變數在一塊區域,未初始化全域性...

C 堆記憶體和棧記憶體詳解

堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...

C 堆記憶體和棧記憶體詳解

堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...