我寫了下列C行。 我想知道是否有語言支持。 它會像:這是允許在C嗎?
char * mode[7] = Config_Msg.DHCP ? "DHCP" : "Static";
基本上我想插入模式「DHCP」或「靜態」的字符串值,取決於在Config_Msg.DHCP值。
當我在IAR編譯,我得到這樣的警告:
Warning[Pe520]: initialization with "{...}" expected for aggregate
這是什麼意思的警告?
我寫了下列C行。 我想知道是否有語言支持。 它會像:這是允許在C嗎?
char * mode[7] = Config_Msg.DHCP ? "DHCP" : "Static";
基本上我想插入模式「DHCP」或「靜態」的字符串值,取決於在Config_Msg.DHCP值。
當我在IAR編譯,我得到這樣的警告:
Warning[Pe520]: initialization with "{...}" expected for aggregate
這是什麼意思的警告?
警告意味着,回答你的問題是沒有。你在做什麼可以在運行時完成,但它在初始化器中無效。只需編寫:
char * mode; mode = Config_Msg.DHCP ? "DHCP" : "Static";
經過仔細檢查,這不是您的警告來源。你有正確聲明模式爲7個指針數組,所以編譯器期待形式的初始化:
char * mode[ 7 ] = { "one", "two", "three" };
(其餘四個項目將被初始化爲全零)。
+1沒有'strcpy'矯枉過正。 –
雖然這樣的初始化**對函數內的變量有效。 –
它也表明,在這之後你不能修改字符串字面值,否則你冒着未定義行爲的風險。 –
不能分配這樣的字符串,所以你應該做這樣的:
char mode[7];
strcpy(mode,Config_Msg.DHCP ? "DHCP" : "Static");
請注意,我還糾正了聲明mode
。你最初聲明瞭一個指針數組。
或者,您也可以用一個指針做到這一點:
char *mode = Config_Msg.DHCP ? "DHCP" : "Static";
您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"
。如果您沒有對您的代碼發表評論,那麼您就會陷入困境。
即使在幾個月內瞭解自己的代碼也可能很痛苦。這就是爲什麼好的評論很重要。
-1(錯誤)使用'strncpy'。不應該教這個功能;它應該被埋起來。 –
我不同意。 strncpy比strcpy安全得多。這是不應該發明的strcpy。 –
不包括零件:「警告:如果src的前n個字節中沒有空字節,放在dest中的字符串將不會以null結尾。」 – AusCBloke
首先,在你的例子中char * mode[7]
應該是char mode[7]
;你想要的數組char
s不是char
指針的數組。
對於你的問題,不,你不能這樣做。你有兩個選擇:
mode
爲char *mode
,並使其點到"DHCP"
或"Static"
mode
作爲char
和副本"DHCP"
或"Static"
到一個數組。請注意,第一種方式您的字符串將是隻讀的(即存儲在.rodata段中),而不像第二種方式將它們複製到數組中並且可以修改。不過,我不認爲這會成爲這個例子的問題。
神祕的答案是正確的,但如果你想知道原因你的代碼無法工作,這有點複雜。您可以使用字符串作爲數組的初始值設定項,但與所有數組對象一樣,除了運算符&
或sizeof
的操作數之外,表達式中的字符串文字(例如您正在使用的?:
表達式)除外,會衰減爲指針。您的?:
表達式的結果是一個指針,指針不是數組的有效初始值設定項。
很好的解釋! –
[Initializing Aggregate Types](http://msdn.microsoft.com/en-us/library/81k8cwsz(VS.71).aspx)應該是一個很好的閱讀。 –