2012-07-24 62 views
2

我試圖爲C字符串數組分配內存。我可以保證這些字符串符合MAX_STRING_LENGTH字符,但我不知道在編譯時數組中有多少個字符串(這是動態計算的)。當我使用代碼...如何爲任意大小的固定長度C字符串數組分配內存

char *strings[MAX_STRING_LENGTH] = malloc(sizeof(char *) * numstrings); 

...編譯器抱怨說這是一個無效的初始值設定項。當我使用代碼...

char strings[MAX_STRING_LENGTH][] = malloc(sizeof(char *) * numstrings); 

...編譯器抱怨一個不完整的元素類型。我在這裏做錯了什麼,以及如何爲這個數組分配內存?

+0

當然,我總是可以爲char **分配內存,然後迭代併爲每個字符串分配一個char *,但這是我試圖避免的迭代和分配。 – 2012-07-24 17:55:25

+0

哦,所以你事先知道了字符串的數量(即在分配之前)。然後,只需創建一個'char **'並按照你所說的迭代。 – houbysoft 2012-07-24 17:57:32

+0

@houbysoft通過「預先」我的意思是在編譯時。我相應地更新了這個問題。 – 2012-07-24 18:05:47

回答

2
char (*strings)[MAX_STRING_LENGTH] = malloc(sizeof *strings * num_strings); 

將分配一個num_strings X MAX_STRING_LENGTH陣列的char爲連續的塊,這樣你就不必做分配的多個層次。

strcpy(strings[i], "This is a test"); 
printf("%s\n", strings[j]); 

等當你完成你只需要free(strings);

該方法的主要缺點是如果num_strings非常大,則可能沒有足夠的內存來滿足請求,並且如果大多數字符串的長度小於MAX_STRING_LENGTH,則會出現一些內部碎片。

+0

不錯。這與我最初的意圖最接近。你提到的兩個缺點是我原來的嘗試會遇到的問題,如果它有效,所以它們是我可以忍受的缺點。謝謝! – 2012-07-25 12:27:12

1
char **strings; 

strings=(char **) malloc(number of strings); 

strings[i]=(char *) malloc(MAX_STRING_LENGTH); 
+0

1)第一次調用忽略指針類型的大小; 2)你不應該從malloc()轉換返回值(參見http://stackoverflow.com/a/605858/28169)。 – unwind 2012-07-24 19:24:51

+0

我用來一直投射malloc,即使我知道void會自動轉換。但是,如果我忘記包含stdlib,我會看到一個有趣的評論,即程序可能會崩潰。有人能解釋爲什麼嗎? – alinsoar 2012-07-24 20:38:53

1

如果是真正的動態,那麼它可能需要是這樣的:

char **strings = malloc(sizeof(char*) * numstrings); 
for (int i = 0; i < numstrings; i++) 
    strings[i] = malloc(MAX_STRING_LENGTH); 

它也可以分配這一切在一個塊(使得釋放它更容易),然後分配數組中的單個指針在分配的緩衝區中計算位置。但是,這增加了一些複雜性,但可能不會超過收益。

+0

這就是我害怕的...... – 2012-07-24 17:56:33

2

本宣言:

char *strings[MAX_STRING_LENGTH] = malloc(sizeof(char *) * numstrings); 

它的內容,如果你定義的C字符串,其計數組 - 而不是單獨的字符串長度 - 是MAX_STRING_LENGTH

更好地界定一個**char,像這樣:

char **strings = malloc(sizeof(char *) * numstrings); 

在你的代碼,當你準備添加一個字符串,例如後來插槽5:

strings[5] = malloc(sizeof(char) * MAX_STRING_LENGTH)); 

或在一個init循環如:

for (i = 0; i < numstrings; i++) 
    strings[i] = malloc(sizeof(char) * MAX_STRING_LENGTH); 

而且,如果在某些時候你需要更多空間的字符串,用realloc成長初期的內存分配。

+0

如果您事先不知道,您需要重新分配。 – AlcoJaguar 2012-07-24 17:58:16

+0

@AlcoJaguar我不追隨你? 「當你去時」?您可以隨時使用'realloc'將_pointer的緩衝區擴展到char_。 – pb2q 2012-07-24 18:01:32

+0

是的,我同意,隨時隨地就像你去的不是嗎?呵呵 – AlcoJaguar 2012-07-24 18:16:16

相關問題