2012-03-08 100 views
3

我有一個創建字符指針數組作爲以下內容的C代碼:用最少的更改將靜態數組更改爲動態數組?

char* arr[100]; 

我使用的每個元素在該數組中爲指向正被另一個函數來計算一些字符串。所以基本上arr [0]會指向string1和arr [1]到string2等。

這工作得很好。不過,現在我要求讓用戶將字符串數量指定爲參數,從而使其更加靈活。

我該如何對代碼進行最小限度的更改?我明白我需要使用malloc。然而,我在之前的所有任務陳述中收到了很多警告。我改變了數組的聲明如下所示:

char* arr = (char*)malloc(n * sizeof(char*)); //where n is provided by user 

我想,我只需要改變的聲明。現在所有的賦值語句都會發出警告(「賦值使得指針中的整數沒有強制轉換」)。以下是一個賦值語句的示例:

arr[i] = str; //where str is defined as char* and is calculated by another function 

我在這裏錯過了什麼嗎?

回答

10

如果您想創建一個char *的數組,您需要一個char **arr。把它想象成一個char *的數組 - 如果你有一個int的數組,你應該有int *。由於您有一組char *s,因此您需要char **

char** arr = malloc(n * sizeof(char*)); 
+0

請取下石膏。在C中,將'void *'轉換爲另一個指針時不需要強制轉換。 – 2012-03-10 17:05:56

+0

已更改,但我不確定OP是否使用C或C++編譯器。 – 2012-03-10 21:24:05

1

要聲明arr作爲爲char **,因爲你是指向指針數組。如果您僅將arr聲明爲char *(而不是char **char *[]),則只有一個「字符串」。

2

您正在聲明arr作爲指向char的指針:要麼是單個字符串,要麼是,如果您願意,可以使用數組char s。

要分配指針數組,聲明arr

char **arr = malloc(n * sizeof(char *)); 

順便提及,去除鑄造:它是C.見unnecessaryQuestion 7.7comp.lang.c FAQ

1

不要忘了字符串數組太(char *),這樣你們就需要指針數組,這應該是這樣的:

char** arr = (char**)malloc(n * sizeof(char*));