2013-06-05 73 views
0

程序應根據輸入創建字符串。我們希望將這些字符串添加到列表中,該列表作爲指針傳遞給函數(指向其他char *指針)。 的代碼如下所示:將char []添加到char **(字符串到字符串列表)

void main(void) { 
    //set angles alpha (small) & beta (large) 
    char ** configurations = calloc(0, sizeof(char*)); 
    int multiplicity = 0; 

    createConfigString(4, 4, 0, configurations, 0, &multiplicity); 
} 

void createConfigString(int a, int b, int c, char ** configurations, int start, int * multiplicity) { 
int x, i; 
int strSize = 2 * (a + b + c); 

for(x = a; x >= (a + (a % 2))/2; x--) { 
    //new entry to configurations if starting a new line 
    if(start == 0) { 
     configurations = realloc(configurations, (*multiplicity + 1) * sizeof(char *)); 
     configurations[*multiplicity] = calloc(strSize, sizeof(char)); 
    } 
    for(i = 0; i < x; i++) { 
     configurations[*multiplicity][start] = "a,"; 
    } 
    if(b == 2) { 
     *multiplicity++; 
     configurations[*multiplicity][start + 2 * x] = "b,b\n"; 
     start = 0; 
     continue; 
    } 
    configurations[*multiplicity][start + 2 * x] = "b,b,"; 
    createConfigString(a - x, b - 2, c, configurations, start + 2 * x + 4, multiplicity); 
} 
} 

,但在編譯它告訴我們,它試圖投指針轉換成int上線

configurations[*multiplicity][start] = "a,"; 
configurations[*multiplicity][start + 2 * x] = "b,b\n"; 
configurations[*multiplicity][start + 2 * x] = "b,b,"; 

當我們寫

configurations[*multiplicity][start] = (int) "a,"; 

等。沒有任何警告編譯

我們做錯了什麼?謝謝

回答

3

那麼,既然configurations是一個char **,然後configurations[n]char *,然後configurations[n][m]有望成爲一個char。您正試圖將char *分配給char,爲此,編譯器必須將指針轉換爲整數類型,然後將其截斷爲char大小。這通常不是編碼者想要的,所以它會產生警告,讓你知道你可能做錯了什麼。把演員告訴編譯器「是的,我真的想這樣做,所以不要警告我」。但是,它可能仍然不會做你在想它做什麼...

而且,這樣的:

char ** configurations = calloc(0, sizeof(char*)); 

可能存在問題。該名男子頁calloc在Linux上有這樣一段話:

If nmemb or size is 0, then calloc() returns either NULL, or 
a unique pointer value that can later be successfully passed to free(). 

既然你不檢查返回值,你可能通過一個空指針到createConfigString。也許你現在的平臺實際上會返回一個「可用」的值,但它不會是可移植的。在它返回NULL的情況下,有可能後面的realloc可能有問題(儘管在Linux上,它似乎可以),你也不會檢查...

+0

我真的是C noob,所以這個解釋真的很有幫助。謝謝! –

2

你不能使用=複製字符串,你必須使用一個函數 - 比如標準的strcpy函數。

所以:

configurations[*multiplicity][start] = "a,"; 

應該是:

strcpy(configurations[*multiplicity][start], "a,"); 

而且同一類型的模式在其他地方。

+0

謝謝!請注意,strcpy需要一個指針,所以它應該是strcpy(&配置[*多重性] [開始],「str」)這是否意味着當我使用 '=「example str」' 「example str」would被讀爲指針? –

+0

任何你想讓角色從一個地方「移動」到另一個地方的地方。 –