二维字符串数组的复合文字

我在一个结构中有一个二维字符串数组,我希望能够在编译时用复合文本初始化它,而不是用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}

发表评论