我在一个结构中有一个二维字符串数组,我希望能够在编译时用复合文本初始化它,而不是用malloc()动态初始化它
这个字符串数组的含义是它是一个项目数组,每个项目都有三个字符串(一个用于项目名称,另一个用于描述,另一个用于URL)
是的,我知道我可以用三个数组代替,但我更喜欢用二维数组
我试着这样写(注意,我只是初始化项的名称,而不是描述或URL…这是故意的,因为我假设指向描述和URL的指针将根据指定的初始值设定者行为自动初始化为NULL——如果不初始化字段,它将变为零)
我的尝试:
枚举标签种类{
你的名字,
L_说明,
L_URL,
L_NUMKINDS};
结构标签类型{
int-someval;
尺寸标签;
字符**标签[L_NUMKINDS];
};
静态结构标签类型mylabel={
.someval=10,
.nlabels=3,
.labels=(char*[[L_NUMKINDS]){
[0][L_NAME]=“名字”;,
[1] [L_NAME]=“第二个名字”;,
[2] [L_NAME]=“第三名”;
}
};
用叮当声编译它,我得到以下警告:
main.c:266:10:警告:不兼容的指针类型使用“char*[3][3]类型的表达式初始化“char**”
[-Wincompatible指针类型]
.labels=(char*[[L_NUMKINDS]){
^~~~~~~~~~~~~~~~~~~~~~~
main.c:266:10:警告:建议围绕子对象的初始化使用大括号[-Wmissing brates]
.labels=(char*[[L_NUMKINDS]){
^~~~~~~~~~~~~~~~~~~~~~~
{
所以,从这些警告来看,我想我做错了什么
这样做的正确语法是什么
结构定义不正确:根据定义,labels是指向char的指针的L_NUMKINDS数组。您可能希望labels指向L_NUMKINDS指针的char数组。定义应该是char*(*labels)[L_NUMKINDS];或更好的常量字符*(*标签)[L_NUMKINDS];,因为您希望使用字符串常量作为初始值设定项
这是一个带有测试程序的修改版本:
#包括<;标准规范>;
标号{
你的名字,
L_说明,
L_URL,
卢努金
};
结构标签类型{
int-someval;
尺寸标签;
常量字符*(*标签)[L_NUMKINDS];
};
静态结构标签类型mylabel={
.someval=10,
.nlabels=4,
.labels=(常量字符*[[L_NUMKINDS]){
[0][L_NAME]=“名字”;,
[1] [L_NAME]=“第二个名字”;,
[2] [L_NAME]=“第三名”;,
[3] [L_NAME]=“第四名”;,
}
};
静态无效pstr(常量字符*名称,常量字符*s){
printf(“s:”名称);
若有(s)
printf(“s”,s);
其他的
printf(";null";);
}
静态无效打印标签(常量结构标签类型*lp){
对于(大小i=0;i<;lp->;nlabels;i++){
printf(“{”);
pstr(“名称”,lp->;标签[i][L_名称]);
printf(“,”);
pstr(“说明”,lp->;标签[i][L_说明]);
printf(“,”);
pstr(“url”,lp->;标签[i][L_url]);
printf(";}\n";);
}
}
int main(){
打印标签(&;mylabel);
返回0;
}
输出:
{name:“First name”,description:null,url:null}
{name:“Second name”,description:null,url:null}
{name:“Third name”,description:null,url:null}
{name:“第四个名称”,描述:null,url:null}