我在C中写了以下这一行。 我想知道语言是否支持。 就是这样:
char * mode[7] = Config_Msg.DHCP ? "DHCP" : "Static";
基本上我想在模式中插入“DHCP”或“STATIC”的字符串值,取决于Config_Msg.DHCP中的值。
当我在IAR中编译时,我收到此警告:
Warning[Pe520]: initialization with "{...}" expected for aggregate
这个警告是什么意思?
答案 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
指针的数组。
对于你的问题,不,你不能这样做。你有两个选择:
mode
声明为char *mode
并将其指向指向"DHCP"
或"Static"
mode
数组保存为char
和复制 "DHCP"
或"Static"
。请注意,第一种方式是将字符串设置为只读(即存储在.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"
。如果你没有评论你的代码,你就会搞砸自己。
即使在几个月内了解自己的代码也会很痛苦。这就是好的评论很重要的原因。