我写了下列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)应该是一个很好的阅读。 –