2011-11-06 65 views
0

我寫了下列C行。 我想知道是否有語言支持。 它會像:這是允許在C嗎?

char * mode[7] = Config_Msg.DHCP ? "DHCP" : "Static"; 

基本上我想插入模式「DHCP」或「靜態」的字符串值,取決於在Config_Msg.DHCP值。

當我在IAR編譯,我得到這樣的警告:

Warning[Pe520]: initialization with "{...}" expected for aggregate 

這是什麼意思的警告?

+0

[Initializing Aggregate Types](http://msdn.microsoft.com/en-us/library/81k8cwsz(VS.71).aspx)應該是一個很好的閱讀。 –

回答

6

警告意味着,回答你的問題是沒有。你在做什麼可以在運行時完成,但它在初始化器中無效。只需編寫:

 
char * mode; 

mode = Config_Msg.DHCP ? "DHCP" : "Static"; 

經過仔細檢查,這不是您的警告來源。你有正確聲明模式爲7個指針數組,所以編譯器期待形式的初始化:

 
char * mode[ 7 ] = { "one", "two", "three" }; 

(其餘四個項目將被初始化爲全零)。

+1

+1沒有'strcpy'矯枉過正。 –

+0

雖然這樣的初始化**對函數內的變量有效。 –

+0

它也表明,在這之後你不能修改字符串字面值,否則你冒着未定義行爲的風險。 –

3

不能分配這樣的字符串,所以你應該做這樣的:

char mode[7]; 
strcpy(mode,Config_Msg.DHCP ? "DHCP" : "Static"); 

請注意,我還糾正了聲明mode。你最初聲明瞭一個指針數組。

或者,您也可以用一個指針做到這一點:

char *mode = Config_Msg.DHCP ? "DHCP" : "Static"; 
-2

char *mode[7]變量是指向字符的指針數組。

而你所要求的是不允許的。但是你可以編寫

char mode[20]; 

strncpy(mode, sizeof(mode), Config_Msg.DHCP ? "DHCP" : "Static"); 

編輯此外

事實上,正如其他人所指出的,strncpy是危險的時候已經達到極限。 我的例子最好是

char mode[20]; 
memset (mode, 0, sizeof(mode)); 
strncpy (mode, sizeof(mode)-1, Config_Msg.DHCP ? "DHCP" : "Static"); 

所以mode最後一個字節仍然是一個零字節。如果您確定mode字符串只能是"DHCP""Static",您應在備註中記錄該信息,並且您可以聲明mode爲最小長度(7,即靜態加1中的字母數)並只使用strcpy。但想象一下,在幾個月內,你有另一種模式,如"automatic"。如果您沒有對您的代碼發表評論,那麼您就會陷入困境。

即使在幾個月內瞭解自己的代碼也可能很痛苦。這就是爲什麼好的評論很重要。

+2

-1(錯誤)使用'strncpy'。不應該教這個功能;它應該被埋起來。 –

+0

我不同意。 strncpy比strcpy安全得多。這是不應該發明的strcpy。 –

+0

不包括零件:「警告:如果src的前n個字節中沒有空字節,放在dest中的字符串將不會以null結尾。」 – AusCBloke

0

首先,在你的例子中char * mode[7]應該是char mode[7];你想要的數組char s不是char指針的數組。

對於你的問題,不,你不能這樣做。你有兩個選擇:

  1. 聲明modechar *mode,並使其"DHCP""Static"
  2. 保持mode作爲char副本"DHCP""Static"到一個數組。

請注意,第一種方式您的字符串將是隻讀的(即存儲在.rodata段中),而不像第二種方式將它們複製到數組中並且可以修改。不過,我不認爲這會成爲這個例子的問題。

1

神祕的答案是正確的,但如果你想知道原因你的代碼無法工作,這有點複雜。您可以使用字符串作爲數組的初始值設定項,但與所有數組對象一樣,除了運算符&sizeof的操作數之外,表達式中的字符串文字(例如您正在使用的?:表達式)除外,會衰減爲指針。您的?:表達式的結果是一個指針,指針不是數組的有效初始值設定項。

+0

很好的解釋! –