c 動態記憶體管理

2021-08-20 08:55:13 字數 2426 閱讀 4160

動態記憶體管理

需要的空間大小在程式執行時才能知道,為了滿足這種需求,需要動態分配空間。

一、動態記憶體函式

1、malloc函式

原型:void *malloc(size_t size);

申請乙個連續可用的空間(

以位元組為單位),並返回指向這塊空間的指標(申請成功)或者返回乙個null指標(申請失敗);

2、free函式

原型:void free(void *ptr);

釋放動態開闢的空間:僅僅是

去掉ptr指標和動態開闢的空間的關聯

3、calloc函式

原型:void *calloc(size_t num, size_t size);

功能和malloc的唯一區別就是,為num個大小為size的元素開闢一塊空間,並將每個空間都初始化為0。

4、realloc函式

原型:void *realloc(void *ptr,size_t size);

對申請的空間大小進行調整。

在擴大原空間時,有兩種情況

1、 原有空間之後有足夠多的空間時,在原有記憶體之後直接追加空間;

2、原有空間之後沒有足夠多的空間時,在堆空間上另找乙個合適大小的連續空間來使用。

特註:用realloc函式申請時,考慮到申請失敗

ptr = realloc(ptr, 1000);
當申請失敗後原空間資料就會丟失,所以這種做法是錯誤的。

正確的做法:

p = realloc(ptr,1000);

if(p != null)

二、總:動態開闢空間的的四大步1、動態申請空間;//申請的空間必比期望申請的空間大,所以一般建議大塊申請。

2、判空(可能存在申請失敗);

3、釋放空間free;//釋放掉後,ptr為野指標(懸垂指標)。

4、將ptr指向null。

三、關於動態記憶體的幾點注意:

1、動態申請完,必須要判空;

2、釋放記憶體free函式必須釋放的是動態申請的空間(堆上開闢的空間);

3、必須整體申請,整體釋放;

四、幾個練習

1、test執行的結果,原因

解析:

正確執行:(改正)

方法1,傳址操作:將變數str的位址作為函式引數

char * getmemory(char **p)

void test(void)

free(str);//str為空時,函式什麼事都不做

str = null;

}

執行成功,結果:hello

方法2:通過函式返回值動態開闢,不傳參

char * getmemory()

}void test(void)

執行成功,結果:hello

2、執行test函式,結果,原因

char * getmemory(void)

void test(void)

編譯通過,但不會輸出hello(已測試過)

原因:getmemory函式的陣列p是儲存在此

函式的棧幀上,函式執行完,棧幀被釋放掉,但是釋放僅是失效,陣列還是存在的,

但是!!!,呼叫完getmemory函式,接下來呼叫的是printf函式,是函式呼叫就會形成棧幀,則就會覆蓋getmemory函式的棧幀(當前已無效),所以,不會輸出「hello」。

五、柔性陣列

定義:結構體中的最後乙個元素允許是未知大小的陣列,該陣列就是柔性陣列。

特點:1、結構體中的柔性陣列成員前面必須至少有乙個其他成員;

2、結構體的大小不包括柔性陣列的記憶體;

3、包含柔性陣列成員的結構體用malloc函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小,以適應柔性陣列的預期大小。

優勢:方便記憶體釋放

使用:

typedef struct st_typetype_a;

int main()

} free(p);

p = null;

system("pause");

return 0;

}

C 動態記憶體管理

我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...

C 動態記憶體管理

1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...

c 動態記憶體管理

c語言動態記憶體管理 c中關於動態記憶體的標準庫函式 malloc calloc realloc free 以下是關於這幾個函式的介紹 1 malloc 用於動態開闢記憶體 堆空間 返回型別為void 引數 size t size 是無符號整型表示要開闢的空間大小,單位是位元組,2 calloc 用...