2012-11-20 22 views
2

我想製作字符串數組,我有功能rLine從stdin讀取行,每輸入一行我需要保存在數組中,但我不知道數字輸入的字符串行。所以,我需要動態增加數組大小來存儲它們,我寫了這樣的代碼:動態數組中的字符串在C

char *res[2], *old = res; 
while(1){ 
    line = rLine(stdin), len = strlen(line); 
    res[row] = (char*)malloc(len + 1); 
    strcpy(res[row++], line); 
    res = (char**) realloc(res, row); /* adding 1 more row, not sure adding size row? */ 
    if (/*some cond*/) break; 
} 

但這代碼似乎並不工作,如何正確聲明數組,增加它的大小?

+2

爲什麼不實現一個簡單的鏈表並在每個元素中存儲一個字符串? – Goaler444

+1

問題是res不是指向指針的指針,是指針數組,其中有2個元素被預先分配。 – imreal

+0

你如何區分EOF?不能'rLine()'告訴你字符串的長度?爲什麼要將兩個任務分配到一條線上? (使用逗號運算符工作,但這裏沒有必要,除非必要,否則不應使用。) –

回答

3

正如我在評論中所說的,指針數組不同於指針指針。您不能嘗試將分配的內存分配給數組。

您應該聲明res作爲指針指針並在循環開始時分配內存,然後再使用它。

嘗試一下這樣的:

char **res = NULL, *old = res; 
while(1){ 
    line = rLine(stdin), len = strlen(line); 
    res = (char**) realloc(res, sizeof(char**) * (row + 1)); /* adding 1 more row, not sure adding size row? */ 
    res[row] = (char*)malloc(len + 1); 
    strcpy(res[row++], line); 
    if (/*some cond*/) break; 
} 

請記住,在大多數情況下,數組衰變爲指針但下處理得非常不同。

+0

這裏有兩個小問題。 (1)像這樣一次分配一行指針會變得昂貴;跟蹤與所使用的數量分開分配的行數通常會更好,並且每次您重新分配()時將分配的行數加倍。 (2)如果'realloc()'失敗,你就會發生泄漏,因爲它只在指向分配內存的指針上寫了一個NULL。你不應該使用'data = realloc(data,size)';使用'void * new_data = realloc(old_data,new_size);'並在'old_data'上覆制之前測試'new_data'的值。 –

+0

@JonathanLeffler,完全同意這兩點(我通常使用步長而不是加倍realloc),但爲了簡單起見,爲了保持代碼類似於舊代碼,我只做了一些小改動。 – imreal

+0

@JonathanLeffler同意,只是爲了簡單,但我添加了'* old = res'然後錯誤處理程序'if(res == NULL)',然後將舊的分配給開始 – NGix