C C 之記憶體函式管理使用

2021-08-21 15:42:41 字數 1873 閱讀 5598

malloc()、free()、calloc()、realloc()函式在標頭檔案stdlib.h中

原型:

void *malloc(size_t size);

malloc()的引數是需要分配的記憶體位元組數。

如果記憶體池中的可用記憶體可以滿足這個需求,maollc就返回乙個指向被分配的記憶體塊起始位置的指標(指標型別為void *)。

如果,作業系統無法向malloc提供足夠記憶體,malloc就返回乙個null指標。因此每個從malloc返回的指標都要進行檢查,確保它並非null。

例如:

#include #include int main()else

}/****輸出****

malloc(100) success!

************/

原型:

void *calloc( size_t num_elements, size_t element_size);

calloc也用於分配記憶體。calloc的引數包括所需元素的數量和每個元素的位元組數。除引數設定於malloc不同外,calloc在分配記憶體時會自動將儲存空間置初值0;

例如:

#include #include int main()else

}/****輸出****

calloc(4, 10) success !

************/

原型:

void * realloc( void *ptr,size_t new_size)

realloc()函式用於修改乙個原先已經分配的記憶體的大小。第乙個引數為需要改變記憶體大小的指標名,第二個引數為新分配記憶體的大小。

使用這個函式,你可以使一塊記憶體擴大或縮小。

如果它用於擴大乙個記憶體塊,那麼這塊記憶體原先的內容依然保留,新增的記憶體新增大原先記憶體塊的後面。

如果用於縮小乙個記憶體塊,該記憶體尾部的部分記憶體便被拿掉,剩餘部分記憶體的原先內容依然保留。

如果原先的記憶體塊無法改變大小,realloc()將分配另一塊正確大小的記憶體,並把原先那塊記憶體的內容複製到新的塊上。

因此,在使用realloc之後,就不能再使用舊記憶體的指標,而是應該使用realloc()所返回的新指標。 realloc()失敗的時候,返回null。若realloc的乙個引數為null,那麼他的行為就和malloc一樣。若第二個引數為0,則效果等同於free()。

原型:

void free(void *ptr)

free函式用於釋放記憶體。引數表示malloc()、calloc()、realloc()返回的位址。若引數等於null,則free不會產生任何效果。free函式無返回值。

c++中動態記憶體建立new分為兩個步驟:

new 實際上總以標準c中的malloc()完成。

例如:

int *q = new

int;

//申請記憶體存入數值888

int *r = new

int(888);

delete operator也相應地分為兩步:

int *r = new

int(888);

delete r;

使用原則:

- 不要用delete來釋放不是new分配的記憶體。

- 不要使用delete來釋放同一記憶體兩次。

- 如果在new表示式中使用,必須在相應的delete表示式中也使用。如果在new表示式中不使用,一定不要在相應的delete表示式中使用。

C C 程式設計之記憶體管理

1 從 全域性 靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。2 常量儲存區 儲存程式中的常量。3 棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器...

C C 程式設計之記憶體管理

記憶體分配方式 c語言中記憶體分配方式 1 從 全域性 靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。2 常量儲存區 儲存程式中的常量。3 棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元...

linux記憶體管理之記憶體分配函式區別

使用者 核心 api名稱 物理連續?大小限制 單位場景 使用者空間 malloc calloc realloc free 不保證堆申請 位元組calloc初始化為0 realloc改變記憶體大小。alloca 棧申請位元組 向棧申請記憶體 mmap munmap 將檔案利用虛擬記憶體技術對映到記憶體...