如何初始化结构数组的结构?

我有以下代码,无法正常工作。它可以编译,但是在执行时会引发很多警告和段错误:

#include <stdio.h>

enum output {
    A,
    B,
    C,
    D,
};

struct translation {
    char *from;
    enum output to;
};

struct dictionary {
    struct translation *foo;
    struct translation *bar;
};

enum language {
    ONE,
    ANOTHER,
};

struct dictionary languages[] = {
        [ONE] = {
                .foo = {
                        {"LF", A},
                        {"LLF", C},
                        {"RRF", D},
                },
                .bar = {
                        {"L", B},
                },
        },
        [ANOTHER] = {
                .foo = {
                        {"FF", B},
                        {"RRF", D},
                },
                .bar = {
                        {"LF", B},
                        {"R", C},
                        {"RR", D},
                },
        },
};

int main(void)
{
        printf("%s\n", languages[ONE].foo[0].from);
        return 0;
}

我可能正在初始化languages错误的方式。

  • 我想要languages一个可以通过language以下方式访问不同字典的数组languages[ONE]
  • 我想使用词典字段访问不同的翻译表: languages[ONE].foo
  • 如语言示例所示,使用语言+字段对访问的所有翻译表可能具有不同的数组长度。

那有可能吗?我究竟做错了什么?

当编译时,gcc我得到以下(裁剪)输出:

asdf.c:27:17: warning: braces around scalar initializer
                 .foo = {
                 ^
asdf.c:27:17: note: (near initialization for ‘languages[0].foo’)
asdf.c:28:25: warning: braces around scalar initializer
                         {"LF", A},
                         ^
asdf.c:28:25: note: (near initialization for ‘languages[0].foo’)
asdf.c:28:26: warning: initialization of ‘struct translation *’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]

[...]

对于代码的多个部分重复相同的警告/注释。

摆弄

您可以执行以下两项操作:

  1. struct translation *foo;分配内存struct translation *bar;(您也可以malloc用来动态分配内存)。例如:
结构字典
{
    结构翻译foo [10]; 
    struct translation bar [10]; 
};
  1. 在定义中使用复合文字:
struct字典语言[] = { 
    [ONE] = { 
            .foo =(结构翻译[]){ 
                    {“ LF”,A},
                    {“ LLF”,C},
                    {“ RRF”,D},
            } 
            ,.bar =(结构翻译[]){ 
                    {“ L”,B},
            },
    },
    [ANOTHER] = { 
            .foo =(结构翻译[]){ 
                    {“ FF”,B},
                    {“ RRF”,D} ,
            } 
            ,.bar =(结构翻译[]){ 
                    {“ LF”,B},
                    {“ R”,C},
                    {“ RR”,D},
            },
    },
};

注意

正如提到@MM,加入预选赛const之前struct dictionary是一个好主意,如果它的值不会在运行时改变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章