歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言復習之動態內存分配

前言
1.數組的元素存儲於內存中連續的位置上。當一個數組被聲明時,它所需要的內存在編譯時就被分配。

2.但是我們也可以使用動態內存分配在運行時為它分配內存。

3.為什麼使用動態內存分配

1>當使用數組時,必須用一個常量來指定數組的長度。但是,有時候,數組的長度常常在運行時才知道。因此,在某些情況下,我們通常采取聲明一個較大的數組,它可以容納可能出現的最多元素。

2>該方法的優點是:簡單。

3>它的缺點是:

Ø  這種聲明在程序中引入了人為的限制,如果程序需要使用的元素數量超過了聲明的長度,它就無法處理這種情況。要避免這種情況,最簡單的方法就是把數組聲明的更大一些。

Ø  如果程序實際需要的元素數量比較少時,巨型數組的絕大部分內存空間都被浪費了。

Ø  如果輸入的數據超過了數組的容納范圍時,程序必須以一種合理的方式作出響應。

一.malloc和free
1.c函數庫提供了兩個函數,malloc和free,分別用於執行動態內存分配和釋放。這些函數維護一個可用內存。

2.當一個程序另外需要一些內存時,它就調用malloc函數,malloc從內存池中提取一塊合適的內存。並向該程序返回一個指向這塊內存的指針。這塊內存此時並沒有以任何方式進行初始化。如果要對其進行初始化,要麼自己動手進行初始化,要麼使用calloc()函數。當一塊以前分配的內存不在使用時,程序調用free函數把它歸還給內存池供以後使用。

3.這兩個函數的原型如下,都在頭文件stdlib.h中聲明

1>void *malloc(size_t  size);

2>void   free(void  *pointer)

4.malloc的參數就是需要分配的內存字節數。如果內存池中的可用內存可以滿足這個需求,malloc就返回一個指向被分配的內存塊起始位置的指針。

1>malloc所分配的是一塊連續的內存。例如:如果請求分配100個字節的內存,那麼它實際分配的內存就是100個連續的字節,並不會分開位於兩塊或多塊不同的內存。同時,malloc實際分配的內存有可能比你請求的稍微多一點。但是這時由編譯器定義的。

2>如果內存池是空的,或者它的可用內存無法滿足要求時。在該情況下,malloc()函數向操作系統請求,要求得到更多地內存,並在這塊內存上執行分配任務。如果操作系統無法向malloc提供更多的內存,malloc就返回一個NULL指針。因此,要對每個從malloc返回的指針都進行檢查,確保它並非NULL是非常重要的。

5.free的參數必須要麼是NULL,要麼是一個先前從malloc,calloc或realloc返回的數值。想free傳遞一個NULL參數不會產生任何效果。

6.malloc並不知道請求的內存需要存儲的是整型、浮點值、結構還是數組。Malloc返回一個類型為void *的指針。在標准中表示一個void *類型的指針可以轉換為其他任何類型的指針。因此,在使用前,要進行強制類型轉換。

Copyright © Linux教程網 All Rights Reserved