C語言動態記憶體分配

2021-09-26 04:26:31 字數 1700 閱讀 5951

​ 前言:要理解動態記憶體分配,我們首先從傳統陣列的缺陷開始講起,為了彌補這些缺陷,我們提出了動態記憶體分配這個概念,然後間接如何用**實現動態記憶體分配以及動態記憶體分配的原理(涉及到c語言記憶體方面和指標的知識),然後講解了和靜態記憶體分配的區別,之後還補充了一定堆疊的知識。重點內容主要在第3點裡面的**部分以及**部分

1.傳統陣列的缺點

​ (1)陣列長度必須事先制定,且只能是常整數,不能是變數

​ 例子:

​ int arr[4];

​ (2)傳*統形式定義的陣列,該陣列的記憶體程式設計師無法手動釋放。*在乙個函式執行期間,系統為該函式中陣列所分配的空間會一直存在,直到該函式執行完畢時,陣列的空間才會釋放。

​ (3)陣列的長度一旦定義,其長度就不能再更改,陣列的長度不能再函式執行的過程中動態的擴充或縮小。

​ (4)a函式定義的陣列(靜態分配的記憶體),在a函式執行期間可以被其它函式使用,但a函式執行完畢之後,a函式中的陣列將無法在被其他函式使用。(因為a函式的記憶體空間會被釋放)即傳統方式定義的陣列不能跨函式使用

2.為什麼需要動態記憶體分配

​ (1)動態陣列很好的解決了傳統陣列的4個缺陷

3.動態記憶體分配舉例_動態陣列的構造

​ (1)知識點1:malloc函式的用法

(2)知識點2:動態一維陣列

​ (3)知識點3:realloc函式的使用(對陣列長度進行擴充)

​ 使用語法很簡單,第乙個引數是陣列名,第二個引數是更改之後的位元組個數

​ 例:

realloc

(parr,

100);/*

1.將會擴充到一百個位元組,之前的20個位元組會儲存,那麼100 / 4 == 25,所以將會有25個int型別元素,同時可以配合sizeof使用,例如: realloc(parr, sizeof(int) * 25);

2.如果第二個引數比之前的要大,則擴充陣列,如果比原陣列小,則縮小陣列

*/

4.靜態記憶體和動態記憶體的比較​ (1)靜態記憶體是有系統分配,有系統自動釋放。

​ (2)靜態記憶體是在棧分配的(棧是一種儲存結構,具有先進先出,後進後出的特點)

​ (3)動態記憶體是在堆中分配的(堆屬於分配記憶體的一種排序方式),程式設計師手動分配,手動釋放

​ (4)靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。

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

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

C語言動態記憶體分配

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

C語言 動態記憶體分配

c語言有儲存變數的區域稱之為棧 stack 除此之外 c語言還允許建立自己的動態記憶體區域 以存放一些臨時的資料 這區域稱之為 堆 heap 也就是存放執行時的資料 可以根據程式的需要 向系統申請所需大小的空間 由於未宣告部分定義他們為變數或者陣列因此只能通過指標去訪問 建立記憶體動態分配主要由4個...