動態記憶體開闢

2021-08-21 13:22:54 字數 1267 閱讀 8321

記憶體分配有三種方式:

1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如說全域性變數,static變數

2.從棧空間分配,函式呼叫完成後被自動釋放

3.從對空間分配,即動態記憶體開闢,比如malloc,calloc,realloc

malloc、calloc、realloc和free

malloc

函式原型 :

void* malloc(size_t size)
這個函式向記憶體申請一塊連續的可用空間,並返回指向這塊空間的指標

calloc

函式原型:

void* calloc(size_t num,size_t size)
與函式 malloc 的區別只在於 calloc 會在返回位址之前把申請的空間的每個位元組初始化為全0

reallc

函式原型:

void* realloc(void* ptr,size_t size)
realloc可以對給定的指標所指向的空間進行調整擴大或者縮小,無論是擴張還縮小,原有記憶體的內容不變,對於縮小,則被縮小的的那部分可能會存在內容丟失問題,realloc並不保證調整後的記憶體空間和原來的空間位址相同,相反,reallc可能會返回乙個新的位址。

realloc是從堆上分配記憶體的,當擴大一塊記憶體時,堆上的空間足夠大時,可以滿足擴大要求,那麼它就在原來的基礎上,擴大位元組數,返回原來記憶體空間的位址;當不滿足擴大要求時,則realloc在堆上找到乙個有足夠大空間的新空間,將原來的資料拷貝至新的位置,並且返回新位址,即realloc可能發生資料遷移。

常見的記憶體錯誤

1.如果分配未成功,但是我們使用了

如果是函式傳參的問題,則在函式內部使用了assert斷言;如果是用malloc等申請記憶體,應該使用if語句進行判斷

2.記憶體分配成功,但是沒有初始化

3、忘記釋放記憶體,會造成記憶體洩露(動態記憶體開闢必須和釋放配對使用)

幾點建議

1 用 malloc 等申請記憶體之後,應該立即檢查指標值是否為 null。防止使用指標值為 null 的記憶體。

2 不要忘記為陣列和動態記憶體賦初值。防止將未被初始化的記憶體作為右值使用。

3 避免陣列或指標的下標越界,特別要當心發生「多 1」或者「少 1」 操作。

4 動態記憶體的申請與釋放必須配對,防止記憶體洩漏。

5 用 free 釋放了記憶體之後,立即將指標設定為 null,防止產生「野指標

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如全域性變數,static變數 2.從棧空間分配,函式呼叫完其被自動釋放 3.從堆空間分配,即動態記憶體開闢,比如 malloc,calloc,realloc,何時申請何時釋放 malloc 函式原型void malloc s...

動態記憶體開闢

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

動態記憶體開闢

動態記憶體開闢的函式有malloc realloc calloc free函式,接下來對每乙個函式進行解釋及使用,並總結出幾個經典的例子鞏固,以及總結常見的錯誤。1.malloc free基本使用 int main free p p null return 0 2.realloc free基本使用 ...