動態記憶體開闢

2021-08-15 08:27:08 字數 1827 閱讀 5589

記憶體分配有三種方式:

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

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

3.從堆空間分配,即動態記憶體開闢,比如:malloc,calloc,realloc,何時申請何時釋放

malloc:

函式原型void* malloc (size_t size)

這個函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標

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

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

- 返回值的型別是 void* ,所以malloc函式並不不知道開闢空間的型別,具體在使用的時候使用者自己來決定。

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

-free前後不會修改指標的指向,指標位址仍然不變,free後目標指標會變為野指標,最好設定為null

- malloc申請的空間可以用memset函式進行初始化

calloc:

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

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

realloc:

函式原型:void *realloc( void *memblock, size_t size )

對malloc申請的記憶體進行大小的調整

-realloc可以對給定的指標所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有記憶體的中內容將保持不變.對於縮小,則被縮小的那一部分的內容會丟失.realloc並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址.相反,realloc返回的指標很可能指向乙個新的位址

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

void test()

}

常見的記憶體錯誤:

1.記憶體分配未成功,但是我們卻使用了它。

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

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

3.忘記釋放記憶體,造成記憶體洩露(動態記憶體的申請與釋放必須配對)

4.釋放了記憶體卻依然繼續使用它

-函式的 return 語句寫錯了,注意不要返回指向「棧記憶體」的「指標」或者「引用」,因為該內存在函式體結束時被自動銷毀。

-使用 free釋放了記憶體後,沒有將指標設定為 null。導致產生「野指標

幾點建議:

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

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

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

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

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

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如說全域性變數,static變數 2.從棧空間分配,函式呼叫完成後被自動釋放 3.從對空間分配,即動態記憶體開闢,比如malloc,calloc,realloc malloc calloc realloc和free mallo...

動態記憶體開闢

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

動態記憶體開闢

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