2016-04-25 15 views
0

比方說,我有一個數組在C:展開的非指針數組

char *list[3] = {"Hello", "world", "!"}; 

我想展開。如果我daclare該數組爲:

char **list = (char **) malloc(3 * sizeof(char *)); // Or sth. like that... 

我可以調整它的大小:

realloc(list, 5 * sizeof(char *)); // Not sure now if I should use `char *` or `char **` 

如果我試試這個:

char *list[3] = {"Hello", "world", "!"}; 
realloc(list, 5 * sizeof(char *)); // Not sure now if I should use `char *` or `char **` 

它說,它不能調整內存WASN」分配。
好吧,但我怎麼能然後調整這樣的數組?

+0

您正在使用'sizeof(char *)'。更好更安全的方法是使用'sizeof * list'代替。 –

+0

這很簡單:要麼你有一個已知大小的數組,要麼你有一個未知大小的數組。您不能同時擁有已知和未知大小的數組。 – Lundin

回答

2

你不行。如果你有一個靜態大小的數組,你根本無法改變它的大小。如果您需要能夠更改大小,請不要使用靜態大小的數組。

PS:你不應該忽略返回值realloc。不能保證realloc能夠增長給定的內存塊,因此它可能會返回一個指向全新內存塊的指針(釋放舊內存)。因此,您應該始終使用由realloc返回的指針,並且在調用realloc之後從不認爲舊指針仍然有效。

0

當你使用下面的語句:

char *list[3] = {"Hello", "world", "!"}; 

...編譯器生成你的陣列。但malloc不知道它。您需要使用malloc進行分配,然後將您的靜態數組複製到動態區域中。只有這樣你纔可以用realloc來改變它的大小。

char *staticList[3] = {"Hello", "world", "!"}; 
// Allocate dynamically. 
char **list = malloc(sizeof(staticList)); 
// Copy static array. 
memcpy(list, staticList, sizeof(staticList)); 
// Change size to 5 entries. 
list = realloc(list, 5 * sizeof(list[0])); 
+0

'list'的初始化不會很好。 –

+0

@JoachimPileborg:謝謝,修正。 – DarkDust

0

簡單的答案是,你不能。你可以有一個固定大小的數組,或者一個動態分配的數組,但是你不能混合它們。

這樣做的原因是,固定大小的數組由編譯在編譯時創建。它只是將程序用來存儲數組的內存置於一邊。如果它是一個局部變量,那麼內存位於堆棧上,如果它是全局變量,則它位於全局數據空間中。像mallocrealloc這樣的動態分配功能從不同的內存池中分配,而這些不同的內存池不兼容。

Variable-length arrays不是由編譯器在編譯時分配的,或他們不會可變 -length陣列。編譯器如何實現它們並不重要,它們仍然是「固定大小」的數組,並且一旦創建就不能重新分配。