初見動態記憶體

2021-09-29 00:09:59 字數 2367 閱讀 5498

c語言程式中,**是放在記憶體中去執行的,我們可以劃分為四大區域。

1.棧區:存放函式的引數值,區域性變數等。當函式執行完畢時他們占有的空間自動釋放。

2.堆區:由程式設計師分配釋放動態(記憶體的申請)。

3.資料區:分為兩種一是常量區,存放常量。一種是是全域性區,存放全域性變數和靜態變數。

4.程式**區:存放函式的二進位制**。

我們一般在棧上面開闢空間來儲存引數和區域性變數:

這裡空間開闢的大小是固定的,陣列必須指定長度,所需要的內存在編譯時分配。但是有時候在程式執行時我們才知道空間的大小,這時我們就需要動態記憶體分配。

1.malloc

2.free

3.calloc

4.realloc

一.malloc和free

malloc

void

*malloc

( size_t size )

;

申請一段連續的空間,並返回void*

如果開闢成功,則返回乙個指向開闢好空間的指標。

如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。

malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定。

如果引數 size 為0,malloc的行為是標準是未定義的,取決於編譯器。

free

void

free

(void

*memblock )

;

動態記憶體的釋放和**

引數 memblock指向的空間不是動態開闢的,那free函式的行為是未定義的。

引數 memblock 是null指標,則函式無操作。

eg:

int

main()

malloc在堆上開闢了一段空間,free釋放了這段空間。

calloc

void

*calloc

( size_t num, size_t size )

;

開闢一段連續的空間並且將它初始化為0。

memblock是調整的記憶體的位址,size是調整後的大小。

(這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料移動到 新 的空間。)

realloc函式的出現讓動態記憶體管理更加靈活。

有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候記憶體,我們一定會對記憶體的大小做靈活的調整。那 realloc 函式就可以做到對動態開闢記憶體大小的調整。

第二中情況的時候,原有空間之後沒有足夠多的空間時,擴充套件的方法是:在堆空間上另找乙個合適大小的連續空間來使用。這樣函式返回的是乙個新的記憶體位址。

eg:

!

[int

main()

else

//擴充套件容量

//**1

ptr =

realloc

(ptr,

1000);

//**2

int*p =

null

; p =

realloc

(ptr,

1000);

if(p !=

null

)//業務處理

兩個記憶體的位置空間不是同一塊地方了,說明記憶體空間不夠擴容開闢了新的空間。

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道。這些往往會使人受盡折磨,所以如果你想深入c c 程式設計,你必須靜下心來好好苦一番。現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞。並且在軟體開發中很多專業人...

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...