C语言结构体二维字符串数组用复合字面量编译时初始化的正确语法
问题分析
你代码的核心错误是结构体中labels成员的类型定义不符合需求:
你声明的char **labels[L_NUMKINDS]语义是「长度为L_NUMKINDS的数组,每个元素是二级字符指针char **」,和你要存储的「多个条目、每个条目包含3个char*字符串指针」的结构类型完全不匹配。你需要的是指向「每个包含L_NUMKINDS个char*元素的数组」的指针,对应声明应为char *(*labels)[L_NUMKINDS]。
修正后完整代码
enum labelkind { L_NAME, L_DESCRIPTION, L_URL, L_NUMKINDS }; struct labeltype{ int someval; size_t nlabels; // 修正类型声明:labels是指向「含L_NUMKINDS个char*元素的数组」的指针 char *(*labels)[L_NUMKINDS]; }; static struct labeltype mylabel = { .someval = 10, .nlabels = 3, .labels = (char *[][L_NUMKINDS]){ [0][L_NAME] = "First name", [1][L_NAME] = "Second name", [2][L_NAME] = "Third name" } };
说明
- 类型匹配:复合字面量
char *[][L_NUMKINDS]在赋值时会自动退化为指向其首元素的指针,刚好和char *(*)[L_NUMKINDS]类型匹配,不会再抛出类型不兼容、缺初始化括号的警告。 - 初始化规则符合预期:未显式初始化的
L_DESCRIPTION、L_URL对应的指针会被自动初始化为NULL,和你预设的逻辑一致。 - 访问方式不变:后续访问条目的字段仍可以用
mylabel.labels[条目索引][字段枚举]的写法,和你原来的预期完全一致。
内容的提问来源于stack exchange,提问作者cesss
相关产品推荐
相关产品推荐

