2012-01-30 21 views
0

我想提出一個自定義的複製功能,這樣之前釋放的指針會發生什麼:如果我不分配它

if (s1 == NULL || s2 == NULL || s2->buf == NULL) 
    return; 

    if (s1->len + 1 < s2->len + 1) 
    { 
     if (s1->buf) 
     free (s1->buf); 

     s1->buf = (char *) malloc (s2->len + 1); 
     if (s1->buf == NULL) 
     return; 
    } 

    for (int i = 0; i < s2->len; i++) 
    s1->buf[i] = s2->buf[i]; 

    s1->len = s2->len; 

是具有字符指針簡單結構的指針,其中爲S1和S2和無符號整數。

if (s1->len + 1 < s2->len + 1) 
    { 
     if (s1->buf) 
     free (s1->buf); 

     s1->buf = (char *) malloc (s2->len + 1); 
     if (s1->buf == NULL) 
     return; 
    } 

這將檢查s1內是否有足夠的空間以適合s2。如果沒有,它會檢查現有的內存並釋放它。在完成之後,它將爲s1分配一個新的內存塊,其大小爲s2 + 1(include \ 0)。

這裏是我很困惑

如果在字符指針爲S2足夠的空間以適應S1(包括\ 0),它不是免費的()和調用malloc()再次,它只是分配給for循環,它會保留s1的原始內容嗎?

+0

你爲什麼要說'if(s1-> len + 1 < s2-> len + 1)...'爲什麼不只是'if(s1-> len < s2-> len)...'? – zellio 2012-01-30 04:07:07

+0

不知道這是多餘的,謝謝 – user1169094 2012-01-30 04:07:52

回答

1

如果在字符指針爲S2足夠的空間以適應S1 (包括\ 0),它不是免費的(),並再次調用malloc(),它只是 在for循環分配,它會保留s1的原始內容嗎?

如果有足夠的空間,您不需要再次釋放或malloc。只要堅持分配的塊。

調用malloc並不特別:它只是給你一個指針,你可以開始存儲數據。如果你已經有了這個指針,太好了。

+0

真棒。謝謝。 – user1169094 2012-01-30 04:20:10

相關問題