c中的查找表

Vic*_*par 6 c arrays struct char

我在C中创建一个查找表当我定义它时:

typedef struct {
 char* action;
 char* message;
} lookuptab;

lookuptab tab[] = {
  {"aa","bb"},
  {"cc","dd"}
};
Run Code Online (Sandbox Code Playgroud)

它编译没有错误,但当我做这样的事情:

typedef struct {
 char* action;
 char* message[];
} lookuptab;

lookuptab tab[] = {
  {"aaa", {"bbbb", "ccc"}},
  {"cc", {"dd", "eeeee"}}
};
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:在嵌套上下文中初始化灵活数组成员

错误:(接近初始化'tab [0] .message')

如何在第二个示例中初始化制表符数组?注意:我知道选项卡数组中的所有值.

更新:消息可以是不同的大小,例如

typedef struct {
 char* action;
 char* message[];
} lookuptab;

lookuptab tab[] = {
  {"aaa", {"bbbb", "ccc", "dd"}},
  {"cc", {"dd", "eeeee"}}
};
Run Code Online (Sandbox Code Playgroud)

非常感谢你.

最好的问候,维克多

Jon*_*ler 12

您不能在数组(结构)中使用包含灵活数组成员的结构.见C99标准§6.7.2.1/ 2:

结构或联合不应包含具有不完整或函数类型的成员(因此,结构不应包含其自身的实例,但可以包含指向其自身实例的指针),除了结构的最后一个成员具有多个一个命名成员可能有不完整的数组类型; 这样的结构(以及可能递归地包含这种结构的成员的任何联合)不应是结构的成员或数组的元素.

所以,请char **改用(并担心如何知道有多少条目):

typedef struct
{
    const char         *action;
    const char * const *message;
} lookuptab;

static const lookuptab tab[] =
{
    { "aaa", (const char * const []){ "bbbb", "ccc"   } },
    { "cc",  (const char * const []){ "dd",   "eeeee" } }
};
Run Code Online (Sandbox Code Playgroud)

这使用C99构造(§6.5.2.5复合文字) - 请注意,如果您不使用C99编译器.

  • 我只需解压旧的C书来理解这个结构;)(Java正在扼杀我的工程技能......) (4认同)