使用庫函數分配和管理內存。在運行時,分配更多的內存給程序使用,主要工具是malloc函數,這個函數接受一個參數:所需要要的內存字節數。malloc函數會找到合適的空閑內存塊,這樣的內存是匿名的,即malloc分配了內存后,不會為其賦名,返回動態分配內存塊的首字節地址,我們可以將這個地址賦給一個指針變量,使用這個指針訪問這塊內存。
malloc函數的返回類型通常被定義為指向char的指針。從ANSI C標準開始,C使用一個新的類型:指向void的指針,該類型相當于一個通用指針。malloc可用于返回指向數組的指針、指向結構體指針等,所以通常該函數的返回值會被強制轉換為匹配的類型。在ANSI C中,我們應該堅持使用強制類型轉換,因為這樣可以提高代碼的可讀性,否則,我們就不容易記住這個指針所指向的實際類型,這樣的閱讀性就大打折扣。把指針void的指針賦給任意類型的指針完全不用考慮類型匹配的問題。如果malloc申請內存分配失敗,會返回空指針。
double* ptd;
ptd = (double*)malloc(30*sizeof(double));
聲明數組有三種方式:
- 聲明數組時,用常量表達式表示數組的維度,用數組名訪問數組的元素。可以用靜態內存成功動態創建這種數組。
- 聲明變長數組時,用變量表達式表示數組的維度,用數組名訪問數組元素,這種數組只能在自動內存中創建。
- 聲明一個指針,調用malloc函數,將其返回值賦給指針,使用指針訪問數組元素,該指針可以是自動或靜態的。
動態分配內存的存儲期從調用malloc函數分配內存到調用free函數釋放內存為止。malloc函數要和free函數一起使用,free函數的參數是malloc返回的指針,free用于釋放之前malloc申請的內存。
靜態內存的數量在編譯時固定的。在程序運行期間也不會改變。自動變量使用的內存數量在程序執行期間自動增加或減少。但動態分配的內存數量只會增加,除非調用free來進行釋放。
分配內存還可用使用calloc函數:
double* buf;
buf = (double*)calloc(100,sizeof(double));
和malloc函數一樣, 在ANSI C之前,calloc函數也返回指向char的指針,在ANSI C之后,返回指向void的指針。如果存儲不同的類型,應使用強制類型轉換運算符。calloc接受兩個參數,一個是所需要的存儲單元的數量,第二個參數為存儲單元的大小(以字節為單位)。
calloc函數有一個特點,會把塊中的所位位置都設置為0.calloc函數也需要要用free函數來釋放分配的內存。