这是允许在C?

时间:2011-11-06 08:13:51

标签: c syntax iar

我在C中写了以下这一行。 我想知道语言是否支持。 就是这样:

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

基本上我想在模式中插入“DHCP”或“STATIC”的字符串值,取决于Config_Msg.DHCP中的值。

当我在IAR中编译时,我收到此警告:

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

这个警告是什么意思?

5 个答案:

答案 0 :(得分:6)

警告意味着您的问题的答案是否定的。您正在做的事情可以在运行时完成,但它在初始化程序中无效。只需写下:

char * mode;

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

仔细检查后,这不是您警告的来源。您错误地将模式声明为7个指针的数组,因此编译器期望初始化表单:

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

(其余四个条目将初始化为全零)。

答案 1 :(得分:3)

你不能像这样分配字符串,所以你应该这样做:

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

请注意,我还更正了mode的声明。你最初声明了一个指针数组。

或者,您也可以使用指针执行此操作:

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

答案 2 :(得分:1)

神秘的回答是正确的,但是如果你想知道原因你的代码无法运行,那就更复杂了。您可以使用字符串文字作为char数组的初始化程序,但是像所有数组对象一样,表达式中的字符串文字(例如您正在使用的?:表达式),除了作为操作数的操作数&sizeof运算符会衰减到指针。 ?:表达式的结果是指针,指针不是数组的有效初始值。

答案 3 :(得分:0)

首先,您的示例中char * mode[7]应为char mode[7];你想要的char数组不是char 指针的数组

对于你的问题,不,你不能这样做。你有两个选择:

  1. mode声明为char *mode并将其指向指向"DHCP""Static"
  2. mode数组保存为char复制 "DHCP""Static"
  3. 请注意,第一种方式是将字符串设置为只读(即存储在.rodata段中),这与将它们复制到数组中并可以修改的第二种方式不同。但是,我认为这不是一个问题。

答案 4 :(得分:-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"。如果你没有评论你的代码,你就会搞砸自己。

即使在几个月内了解自己的代码也会很痛苦。这就是好的评论很重要的原因。