1. 程式人生 > >動態記憶體分配實用案例(二)之複製字串

動態記憶體分配實用案例(二)之複製字串

用動態分配記憶體製作一個字串的一份拷貝。注意:呼叫程式應該負責檢查這塊記憶體是否分配成功,這樣做允許程式以任何它所希望的方式對錯誤作出反應。

#nclude <stdlib.h>
#include <string.h>
char * strdup( char const *string )
{
    char *new_string;
    
    //請求足夠長度的記憶體,用於儲存字串和它的結尾NUL位元組
    
    new_string = malloc( strlen( string ) + 1 );
    
    //如果我們得到記憶體,就複製字串
    
    if( new_string != NULL )
        strcpy( new_string, string );
        
        
    return new_string;
}

輸入被讀入緩衝區,每次讀取一行。此時可以確定字串的長度,然後就分配記憶體用於儲存字串。最後,字串被複制到新記憶體。這樣緩衝區又可以用於讀取下一個輸入行。

上面的程式返回一個輸入字串的拷貝該拷貝儲存於一塊動態分配的記憶體中。函式首先試圖獲得足夠的記憶體來儲存這個拷貝。記憶體的容量比字串的長度多一個位元組,以便儲存字串結尾的NUL位元組。如果記憶體分配成功,字串就被複制到這塊新記憶體。最後,函式就返回一個指向這塊記憶體的指標。注意,如果由於某些原因導致記憶體分配失敗,new_string的值將為NULL。在這種情況下,函式將返回一個NULL指標。

什麼時候記憶體會分配失敗呢?

對於malloc動態記憶體分配函式來說,如果記憶體池是空的,或者它的可用記憶體無法滿足你的要求時,會發生什麼情況呢?

在這種情況下,malloc函式向作業系統請求,要求得到更多的記憶體,並在這塊記憶體上執行分配任務。如果作業系統無法向malloc函式提供更多的記憶體,malloc就返回一個NULL指標。因此,對每個從malloc返回的指標都應該進行檢查,確保它並非NULL是非常重要的。

最後,對上述函式做出一個總結,該函式就是對輸入的字串檢查它的長度,然後動態分配記憶體,記憶體的大小是字串長度多一個位元組,用於儲存字串結尾的NUL位元組,之後,判斷動態記憶體分配是否成功,如果成功,則執行復制字串操作,對函式接收的字串複製到一塊新的記憶體中去。函式返回一個指向該記憶體的指標。如果記憶體分配失敗,則函式返回一個NULL指標。