動態記憶體分配

2021-08-01 13:34:15 字數 1104 閱讀 1557

《c與指標》讀書筆記

1.為什麼使用動態記憶體分配

陣列在使用的時候可能造成記憶體浪費,使用動態記憶體分配可以解決這個問題。

2. malloc和free

c函式庫提供了兩個函式,malloc和free,分別用於執行動態記憶體分配和釋放。

(1)void *malloc(size_t size);

malloc的引數就是需要分配的記憶體位元組數。malloc分配一塊連續的記憶體。如果作業系統無法向malloc提供更多的記憶體,malloc就返回乙個null指標。

(2)void free(void *pointer);

free的引數要麼是null,要麼是乙個先前從malloc、calloc或realloc返回的值。

3. calloc和realloc

(1)void *calloc(size_t num_elements,size_t element_size);

calloc也用於記憶體分配。malloc和calloc之間的主要區別是後者在返回指向記憶體的指標之前把它初始化為0。

(2)realloc(void *ptr,size_t new_size);

realloc函式用於修改乙個原先已經分配的記憶體塊的大小。如果它用於擴大乙個記憶體,那麼這塊記憶體原先的內容依然保留,新增加的記憶體新增到原先記憶體塊的後面。如果它用於縮小乙個記憶體塊,該記憶體塊尾部的部分記憶體被拿掉,剩餘部分記憶體的原先內容依然保留。

4. 使用動態分配的記憶體

(1)使用示例

int *pi;

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

if(pi == null)

(2)使用間接訪問

int *pi2,i;

pi2 = pi;

for(i = 0;i < 25;i += 1)

*pi2++ = 0;

也可以使用下標。

int i;

for(i = 0;i < 25;i += 1)

*pi[i] = 0;

5. 常見的動態記憶體錯誤

常見的錯誤有:對null指標進行解引用操作、對分配的記憶體進行操作時越過邊界、釋放並非記憶體分配的記憶體、試圖釋放一塊動態分配的記憶體的一部分以及一塊動態記憶體釋放之後被繼續使用。

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...

動態記憶體分配

c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...