2014-02-19 35 views
0

我已經有了這個功能,一個小錯誤:錯誤複製的字符串數組用C

char **addtotab(char **tab, char *newline) { 
    int u; 
    char **new; 

    u = 0; 
    while (tab[u]) 
    u++; 

    if ((new = (char **)malloc(sizeof(char *) * (u + 2))) == NULL) 
    return (NULL); 

    u = 0; 
    while (tab[u]) { 
    new[u] = strdup(tab[u]); 
    u++; 
    } 
    new[u] = strdup(newline); 
    new[u + 1] = NULL; 

    u = 0; 
    while (tab[u]) { 
    free(tab[u]); 
    u++; 
    } 
    free(tab); 
    return (new); 
} 

它從main()這樣調用:

tab = addtotab(tab, line) 

我的問題是tab有程序結束時錯誤的數據。 tab[0]總是空的。

例如,我初始化tab與此數據:

Alii summum decus in carruchis solito altioribus 
Et quia Montius inter dilancinantium manus 
Restabat ut Caesar post haec properaret accitus et 
Siquis enim militarium vel honoratorum aut nobilis 
Et olim licet otiosae sint tribus pacataeque 
Ut enim quisque sibi plurimum confidit et ut 
Sed laeditur hic coetuum magnificus splendor 
Etenim si attendere diligenter, existimare vere de 
Denique Antiochensis ordinis vertices sub uno 
Post quorum necem nihilo lenius ferociens Gallus 

,但我得到這個結果

Empty 
Et quia Montius inter dilancinantium manus 
Restabat ut Caesar post haec properaret accitus et 
Siquis enim militarium vel honoratorum aut nobilis 
Et olim licet otiosae sint tribus pacataeque 
Ut enim quisque sibi plurimum confidit et ut 
Sed laeditur hic coetuum magnificus splendor 
Etenim si attendere diligenter, existimare vere de 
Denique Antiochensis ordinis vertices sub uno 
Post quorum necem nihilo lenius ferociens Gallus 

你能幫助我嗎?非常感謝。

+1

[請不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。這不是問題的原因,而是一個友好的提示。 – unwind

+0

嘿嘿,學校反射(尊重...「)」 – oxmolol

+0

我回滾了你最近的編輯。指出問題解決的方法是接受一個答案(你已經完成了),而不是爲標題添加「已解決」。 –

回答

0

您必須爲u + 2而不是u + 1元素分配空間。

例如,如果u2,您的原始選項卡有3個元素(第一個,第二個,NULL),現在您需要4個元素的空間。

+0

好吧,我是個白癡,現在我只鬆開第一行。 thx karoly – oxmolol

+0

問題解決了,許多thx都是你的2. – oxmolol

0

除了爲u+2項目分配內存,問題是你沒告訴我們你如何將它傳遞給函數之前創建的選項卡行

free(*tab); 

,但也有兩個可能性:

  • 如果您在創建創建new[]以同樣的方式,那麼你需要按照反向相同的步驟free()它:
 
    int u = 0; 
    while (tab[u]) { 
     free(tab[u]); 
     tab[u] = NULL; // Not necessary, but makes debugging easier. 
    } 
    free(tab); 
    tab = NULL; 
  • 如果沒有malloc()創建它,然後`free()的「荷蘭國際集團則是一個錯誤。
+0

strdup使用malloc,所以我需要釋放它, 一個朋友幫了我,現在我有了一些免費的新線(看EDIT) 免費不是現在的問題。我現在只失去第一條線。 – oxmolol

+0

問題解決了,很多thx都是你的2. – oxmolol

+0

請更新你的文章的問題和解決方案,以便下一個人將從中受益。謝謝! –