2011-11-06 62 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

很好的解释! –