您不能分配給C中的數組。C允許啓動修改數組的值爲編譯時常量。如果您想稍後更改值,或者設置非編譯時常量的值,則必須手動分配給數組的特定索引。
所以,你的分配sXSongBuffer
在C.不允許此外,由於sXSongBuffer[0]
到sXSongBuffer[19]
是數組太大,你甚至不能說:sXSongBuffer[0] = "New Song";
取決於你想要什麼,這可能會爲你工作:
/* declare sXSongBuffer as an array of pointers */
char *sXSongBuffer[30] = {
"Thriller",
"Don't Stop Till You Get Enough",
"Billy Jean",
NULL /* set the rest of the elements to NULL */
};
size_t i;
/* and then later in your code */
sXSongBuffer[0] = "New Song";
sXSongBuffer[1] = "More Music From Me";
for (i=2; i < sizeof sXSongBuffer; ++i)
sXSongBuffer[i] = NULL;
但是,上述只有在編譯時知道所有字符串的情況下才有效。如果沒有,你將不得不決定是否要「足夠大」的數組,或者如果你需要動態內存的字符串和/或字符串的數量。在這兩種情況下,您都需要使用等效的strcpy()
來複制字符串。
編輯:
你宣佈的30個字符指針數組與前三個元素指向緩衝串的大小,即BUFF指向:要回應註釋sXSongBuffer[0]
將不會包含大於"Thriller"
的任何字符串,如果他確實有sXSongBuffer[0] = malloc(32);
,他會得到一個小記憶韭菜。另外,他將不得不爲malloc
內存中的每個插槽中的其餘插槽。他應該在運行時使用2d char數組(如OP +指定的初始值)或每個緩衝區的malloc
並複製值。他還需要記住free
任何他記憶的東西。
在char *sXSongBuffer[30];
sXSongBuffer
是大小30的陣列,每個元件是char *
,一個指針char
。當我這樣做時:
char *sXSongBuffer[30];
這30個指針中的每一個都未初始化。當我這樣做:
char *sXSongBuffer[30] = { "Thriller", ... };
我將指針設置爲不同的只讀位置。沒有什麼能夠阻止我將指針重新指向其他地方。這是因爲如果我有:
char *data = "Hello";
printf("%s\n", data);
data = "Hello, world";
printf("%s\n", data);
在上面的代碼中,我分配到data
第一"Hello"
,然後將其更改後指向一個更長的字符串。在我的回答中,上面的代碼沒有什麼比稍後將sXSongBuffer[i]
重新指派給別的東西,並且由於sXSongBuffer[i]
是一個指針,所以賦值是確定的。特別地,sXSongBuffer[0]
是char *
,並且可以指向其中包含char
的任何有效位置。
正如我在回答中所說的,如果字符串在編譯時不知道,這個方案不起作用,而且必須要麼使用「足夠大」的數組,要麼動態分配內存足夠大。
你正在聲明一個由30個字符指針組成的數組,前三個元素指向緩衝區大小的字符串,即由sXSongBuffer [0]指向的buff不會包含大於「Thriller」的任何字符串,如果他做sXSongBuffer [0] = malloc(32);'他會得到一個小小的記憶韭菜。另外,他必須爲陣列中其餘的每個插槽分配malloc內存。他應該像使用OP中的2d char數組一樣使用指定的init,或者在運行時使用每個緩衝區的malloc並複製值。他還需要記住釋放任何他mallocs的內存。 – 2010-02-16 11:13:31
@羅伯特:請看我的編輯。 – 2010-02-16 11:26:30