C語言天天練(九) 動態記憶體分配

2021-09-07 11:22:22 字數 1694 閱讀 6583

引言:陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時。它所須要的內存在編譯時就被分配。

可是,我們能夠使用動態記憶體分配在執行時為它分配記憶體。

一塊記憶體的生命週期能夠分為四個階段:分配、初始化、使用、釋放。

記憶體的分配一般使用c函式庫裡的malloc函式(原型:void *malloc(size_t size))。

關於malloc函式應該注意一下幾點:

1、malloc的引數就是須要分配的記憶體的位元組數。

2、malloc所分配的是一塊連續的記憶體。

3、分配成功。則返回指向分配記憶體起始位址的指標。分配失敗,返回null指標。

4、對每乙個malloc返回的指標都進行檢查,是好的習慣。

記憶體的初始化一般要在使用之前手動進行,也能夠在分配時由calloc函式一同完畢:將分配記憶體初始化為0。

使用就是使用分配所返回的指向記憶體的指標。

釋放記憶體是為了防止記憶體洩露,一般使用free函式(原型:void free(void *pointer))完畢。它的引數必須是先前從malloc、calloc或realloc返回的值。向free傳遞乙個null引數不會產生不論什麼效果。向free傳遞其它引數會出錯。

注意:常見的動態記憶體錯誤有下面幾種

1、忘記對null指標進行解引用操作,即忘記對分配返回的值做推斷。

2、對分配的記憶體進行操作時越過邊界。

3、釋放並不是動態分配的記憶體,傳遞給free的必須是乙個從malloc、calloc或realloc返回的指標。

4、試圖釋放一塊動態分配的記憶體的一部分。

5、一塊動態記憶體被釋放後被繼續使用。

使用動態記憶體的程式設計總結:

1、動態記憶體分配有助於消除程式內部存在的限制。

2、使用sizeof計算資料型別的長度,調高程式的可移植性。

補充:calloc和realloc函式

void *calloc(size_t nmemb, size_t size);

void *realloc(void *ptr, size_t size);

calloc與malloc的差別一是前者返回指向記憶體的指標之前把它初始化為0.二是calloc的引數包含所需元素的數量和每乙個元素的位元組數。依據這些值,可以計算出總共須要分配的記憶體。

realloc函式用於改動乙個原先已經分配的記憶體卡的大小。使用該函式,能夠使一塊記憶體擴大或縮小。假設原先的記憶體卡無法改變大小。realloc將分配還有一塊正確大小的記憶體,並把原先那塊記憶體的內容拷貝到新的塊上。

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

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

C語言天天練(二四) 記憶體分配

引言 對於c語言程式,了解它執行時在記憶體中是怎樣分配的對於我們理解它的執行機制是很實用的。以下就總結一下c語言程式的一些記憶體分配知識。一 一段c程式。編譯連線後形成的可執行檔案一般有 段 資料段 堆和棧等幾部分組成。當中資料段又包含僅僅讀資料段 已初始化的讀寫資料段和未初始化的bss段。例如以下...

C語言動態記憶體分配

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