在前面一系列的字符串操作中,我們都是先定義一個固定大小的字符數組,然后根據所需,或拷貝、或連接、或格式化來為這個數組提供內容。固定大小的數組意味著在程序運行期間,數組所占用的內存是確定的(即劃分了固定數量的內存),很多時候,這種方式簡單好用。但是由固定二字也可以看到,這種方式也讓它失去了靈活性。
假定我們現在要從磁盤上加載了一個新聞文件,那么,我們應該定義一個多大的字符數組才能保證完全容納新聞內容呢?顯然,這個大小很難確定。小了,內容會讀取不全;大了,會浪費更多的內存。假如說我們有方法獲得新聞內容的長度,然后分配同等大小的緩沖區(即字符數組),這該多完美!這便是動態內存分配一展身手的地方了。
malloc:動態分配指定數量的存儲空間


我們秉承的是由簡單到復雜的原則,因此這個示例僅用于說明malloc函數的使用。對于這種僅分配一個整數的情況,使用malloc完全不劃算,不如直接定義一個變量簡單好用。
free:釋放malloc分配的存儲空間
拋開虛擬內存等機制,計算機系統內存是有限的,如4GB、8GB。malloc用于向系統申請一定數量的內存,如果你的程序一味的申請內存供自己使用,那么系統可分配給其它程序的內存就會減少,到最后無內存可用,最終導致系統運行緩慢,不穩定等問題。顯然,這種只索取不奉獻的行為是不可取的因此,C語言提供了free函數,用于向系統返還借用的內存。
當你忘記使用free釋放由malloc分配的內存時,表明程序存在”內存泄露“這一頑疾,因此對于上面的程序,我們在return 0之前,使用下面的代碼進行完善。

動態數組
在實際開發中,像第一個示例那樣為單個數據動態分配內存的情況很少見。更多時候,我們是分配一整塊內存空間供程序使用。一整塊所暗含的另一個意思就是這塊內存區域中的地址是連續的,這一整塊數據區域也可以稱為緩沖區(buffer)。現在讓我們回過頭來解決文章開始提出的問題。

新聞的內容長度是58個字節,這是我提前使用strlen()測試出來的。因為C語言要求字符串必須以'0'結尾,因此我們在使用malloc分配內存時多分配了一個字節,用以存儲這個標記。strcpy_s在拷貝完成后,會在目標串(message)后追加結束標記,因此不需要手動設置標記。
你可以嘗試將例子中lengt+1全部變為length,再次運行時程序會中斷,因為分配的緩沖太小了——只能夠存儲字符串,不能夠存儲最后一位結束符標記。

最后要說明的是:事實上malloc返回的地址類型是void*,但是在C語言環境中,可以由一個確切的類型直接持有此地址,如
int *pa = malloc(sizeof(int));
但是,通常為了通用性,建議將返回類型強制轉換為對應的類型:
int *pa = (int*)malloc(sizeof(int));
這便是內存動態分配了!