2010-02-16 67 views
2
char sXSongBuffer[20][30]; 
sXSongBuffer = {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"}; 

爲什麼這會返回錯誤expected expression before ‘{’ token?我想像這樣初始化我的數組的原因是我可以稍後更改它的內容:爲什麼我不能像這樣初始化一個cstrings數組?

sXSongBuffer = {"New Song", "More Music From Me"}; 

回答

6

您不能分配給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的任何有效位置。

正如我在回答中所說的,如果字符串在編譯時不知道,這個方案不起作用,而且必須要麼使用「足夠大」的數組,要麼動態分配內存足夠大。

+0

你正在聲明一個由30個字符指針組成的數組,前三個元素指向緩衝區大小的字符串,即由sXSongBuffer [0]指向的buff不會包含大於「Thriller」的任何字符串,如果他做sXSongBuffer [0] = malloc(32);'他會得到一個小小的記憶韭菜。另外,他必須爲陣列中其餘的每個插槽分配malloc內存。他應該像使用OP中的2d char數組一樣使用指定的init,或者在運行時使用每個緩衝區的malloc並複製值。他還需要記住釋放任何他mallocs的內存。 – 2010-02-16 11:13:31

+0

@羅伯特:請看我的編輯。 – 2010-02-16 11:26:30

0

C沒有通用數組文字。 {}列表語法僅在初始化時起作用,即,在聲明變量的同一語句中分配值時才起作用。

0

你不能只寫

char sXSongBuffer[20][30]; 
sXSongBuffer = {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"}; 

必須要麼初始化數組一次(但會containt只有3項):

char * sXSongBuffer[]= {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"}; 

或者無論是在每一個項目使用stnrcpy

char sXSongBuffer[20][30]; 
strncpy(sXSongBuffer[0],"Thriller",29); 
strncpy(sXSongBuffer[1],"Don't Stop Till You Get Enough",29); 
strncpy(sXSongBuffer[2],"Billy Jean",29); 
+0

他可以用指定初始化爲了得到自己想要的效果。 – 2010-02-16 11:16:50

0

看看Designated Initializers

#include <stdio.h> 

int main (void) { 

    char a[6][6] = { [2] = "foo", [4] = "bar" }; 

    for (int i=0; i<6; ++i) 
     printf("%d == %s\n", i, a[i]); 

    return 0; 
} 

這是一個c99功能。

gcc -W -std=c99 2dInit.c -o 2dInit 

此輸出:與編譯

0 == 
1 == 
2 == foo 
3 == 
4 == bar 
5 == 

在你的情況,你想做的事:

char sXSongBuffer[20][30] = { 
    [0] = "Thriller", 
    [1] = "Don't Stop Till You Get Enough", 
    [2] = "Billy Jean" 
}; 
相關問題