C語言動態記憶體分配

2022-08-12 15:45:13 字數 1830 閱讀 2010

1、new操作符和malloc函式

c++中的new操作符會隱式的考慮到分配的資料型別(與delete配合使用),表示式例項(以int型別為例)

new

int[4]

malloc函式向系統申請一塊指定大小的連續記憶體塊(與free配合使用),需要乙個引數來指定分配空間的位元組大小,函式原型為

void* malloc(unsigned size)

表示式例項

malloc(4*sizeof(int))

malloc函式在記憶體的堆區中查詢符合要求的記憶體塊,若成功則做好標記表示已分配並返回指向該記憶體塊起始位元組的指標(不清理該記憶體塊)否則返回null,因此使用其分配的記憶體前應檢查該指標的有效性。其中指標有效性可用斷言assert,其本質上是一種巨集而非函式。它以乙個布林值為引數,然後實現類似測試的功能,如果測試結果為真,它實際上什麼都不做,如果結果為假,assert會終止程式執行,然後提示程式終止的位置,此時編譯器會提示包含執行**的檔案號以及終止的assert語句的行號。(基本思想:在繼續執行斷言以後的操作時,保證某些條件的值為真)。

拓展總結

特徵new/delete

malloc/free

分配記憶體的位置

自由儲存區

堆記憶體分配成功的返回值

完整型別指標

void*

記憶體分配失敗的返回值

預設丟擲異常

返回null

分配記憶體的大小

由編譯器根據型別計算得出

必須顯式指定位元組數

處理陣列

有處理陣列的new版本new

需要使用者計算陣列的大小後進行記憶體分配

已分配記憶體的擴充

無法直觀地處理

使用realloc簡單完成

是否相互呼叫

可以,看具體的operator new/delete實現

不可呼叫new

分配記憶體時記憶體不足

客戶能夠指定處理函式或重新制定分配器

無法通過使用者**進行處理

函式過載

允許不允許

建構函式與析構函式

呼叫不呼叫

2、calloc函式

calloc函式與malloc函式的主要差別是函式原型不同,calloc函式原型為

void* calloc(unsigned nitems, unsigned size)

其功能是分配nitems個連續的記憶體塊,每塊位元組數為size。由於calloc函式實質上是分配nitems*size個位元組的連續記憶體塊,因此,calloc(nitems,size)與malloc(nitems*size)功能上等同。不同於malloc函式,處理細節上,calloc函式將所分配的記憶體塊清零。

3、realloc函式

函式原型

void* realloc(void *block, unsigned size)

用於動態申請記憶體後,空間的大小調整,該函式將釋放和重新分配記憶體塊在一次呼叫中完成,引數block是被釋放的記憶體塊的起始位址,引數size說明新申請的位元組數,細節上,函式先判斷是否可在原申請的記憶體空間上拓展成符合重新分配要求的新空間,若可,則執行;否則,函式在堆區中尋找符合重新分配大小的空間,若找到,則拷貝原空間儲存資訊的位模式到新空間,返回向該記憶體塊起始位元組的指標釋放原空間,如果未找到符合要求的空間,realloc返回null不釋放原空間。

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C語言動態記憶體分配

c語言動態記憶體分配 動態資料結構可以在執行時靈活新增 刪除或重排資料項。在執行時分配記憶體空間的過程稱為動態記憶體分配。記憶體分配函式如下 malloc 分配所需的位元組大小,並返回指向所分配空間的第乙個位元組的指標 calloc 為元素陣列分配空間,並初始化為零,然後返回指向該記憶體的指標 fr...

C語言 動態記憶體分配

c語言有儲存變數的區域稱之為棧 stack 除此之外 c語言還允許建立自己的動態記憶體區域 以存放一些臨時的資料 這區域稱之為 堆 heap 也就是存放執行時的資料 可以根據程式的需要 向系統申請所需大小的空間 由於未宣告部分定義他們為變數或者陣列因此只能通過指標去訪問 建立記憶體動態分配主要由4個...