C語言記憶體動態分配與釋放

2021-09-01 07:12:36 字數 1471 閱讀 6778

對於記憶體的分配,主要採用的是標記法。

分配方法有兩種,一種是靜態分配,也就是在程式編譯的時候,就完成了對記憶體的分配。例如當乙個陣列在宣告時,指定長度之後,它所需要的內存在編譯時就會被分配。

另一種方法是動態分配,動態分配是指程式在執行時為它分配記憶體。

分配記憶體的時候,對於已分配的記憶體,作業系統會給乙個標記,未分配的記憶體,作業系統也會有乙個標記,作業系統辨別記憶體是否可以使用就是通過標記判斷,當記憶體釋放的時候,就會修改標記。

c函式庫關於記憶體的動態分配和釋放提供了四個函式malloc、calloc、realloc和free。其中前三個是執行記憶體動態分配,最後乙個是執行釋放。

malloc函式所需要的引數是要分配的位元組長度,例如

int *p; p = (int *)malloc(100);

對於上面的**,如果乙個整數占有四個位元組的話,將會分配25個整數的記憶體。為了增加**的可移植性,如果要分配25個整數的記憶體,應將**改為

int *p; p = (int *)malloc(25*sizeof(int));

在molloc函式分配記憶體時,會從記憶體中提取一塊合適大小的記憶體,並返回該塊記憶體的首位址,這塊記憶體並沒有被初始化。對於這種方法,必然會有問題出現,就是可用記憶體的大小不能滿足請求所需要的記憶體,此時,malloc函式返回null。所以,使用malloc函式分配記憶體之後,並不能保證記憶體分配成功,在使用的時候,應該先判斷指標是否為null,如果不為null,則說明分配成功,可以使用。否則,反之。

calloc函式所需要的引數是元素的個數和元素的位元組長度,之所以要這兩個引數,是因為使用calloc函式在分配記憶體的時候,會對記憶體進行初始化,如果要初始化,就需要知道乙個元素是多大,為了計算總的記憶體大小,還應該知道元素的個數。

calloc函式與malloc函式的主要差別就是在返回首位址的指標之前,對進行了初始化,如果在程式只是想將一些值存放到陣列中,那麼這個初始化就純屬浪費。

relloc函式需要的引數為原來記憶體的首位址新的記憶體的長度。

realloc函式用於修改已經分配記憶體的大小,使用這個函式可以將一塊記憶體擴大或縮小。如果擴大一塊記憶體,那麼這塊記憶體原先的內容必然會被保留,新增加的記憶體新增到原來記憶體的後面;如果縮小,對於尾部的記憶體會被釋放。

對於擴大記憶體,依然存在記憶體不夠的問題,如果分配不成功,就會返回null。除此之外,還有另乙個問題,就是擴大記憶體的時候,不可修改原來記憶體的大小,此時系統將會重新分配一塊記憶體,將原來記憶體的資料複製到新的記憶體中,所以使用realloc函式修改記憶體大小之後,應該使用realloc函式返回的指標而不是原來的指標。

free函式所需要的引數是乙個指標,功能是將指標指向的記憶體區域釋放(通過修改標記實現),以便記憶體可以重新使用。

free函式釋放的只是指標指向的記憶體,指標所占用的空間並未被改變,呼叫free函式之後,指標所指向的位址仍然不變,如果在程式的後面,重新分配到了該指標指向的記憶體,使用現在的指標也可訪問,但是不安全。此時,該指標被叫做野指標,為了避免野指標,應在呼叫free函式之後,將指標的值置為null。

C語言記憶體動態分配與釋放

c語言的函式malloc和free 1 函式malloc和free在標頭檔案中的原型及引數 void malloc size t size 動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為null。void free void ptr 釋放動態申請的記憶體空間,呼叫free ...

C語言記憶體動態分配與釋放

對於記憶體的分配,主要採用的是標記法。分配方法有兩種,一種是靜態分配,也就是在程式編譯的時候,就完成了對記憶體的分配。例如當乙個陣列在宣告時,指定長度之後,它所需要的內存在編譯時就會被分配。另一種方法是動態分配,動態分配是指程式在執行時為它分配記憶體。分配記憶體的時候,對於已分配的記憶體,作業系統會...

記憶體動態分配與釋放

1 c語言的函式malloc和free 1 函式malloc和free在標頭檔案中的原型及引數 void malloc size t size 動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為null。void free void ptr 釋放動態申請的記憶體空間,呼叫fre...