C:数组结构中的结构数组

时间:2012-08-25 13:04:59

标签: c arrays struct

我有这些结构:

struct menu_item{
    int id;
    char *text;
};

struct menu_tab{
    char *label;
    unsigned char item_count;
    struct menu_item *items;
};

struct menu_page{
    char *label;
    unsigned char tab_count;
    struct menu_tab *tabs;
};

struct Tmenu{
    unsigned char page_count;
    struct menu_page *pages;
};

我想定义整个菜单系统:

struct Tmenu menu_test = {
    2,
    {
        "F1",
        2,
        {
            {
                "File",
                8,
                {
                    {1, "text  1"},
                    {2, "text2"},
                    {3, "text3333333"},
                    {4, "text4"},
                    {5, "Hello"},
                    {6, "42"},
                    {7, "world"},
                    {8, "!!!!!!!!"}
                }

            },
            {
                "File2",
                3,
                {
                    {11, "file2 text  1"},
                    {12, "blah"},
                    {13, "..."}
                }

            }
        }
    },
    {
        "F2",
        1,
        {
            {
                "File3",
                5,
                {
                    {151, "The Answer To Life"},
                    {152, "The Universe"},
                    {153, "and everything"},
                    {154, "iiiiiiiiiiiiiiiis"},
                    {42, "Fourty-Two"}
                }

            }
        }
    }
};

但是当我尝试编译时,我收到extra brace group at end of initializer错误消息。

我尝试了许多不同的方法,但没有一个成功。那么在C中是否可以使用复杂的结构,像这样?

3 个答案:

答案 0 :(得分:1)

不,这种用法是不可能的,至少在#34; old" (C89)C。结构文字不能用于将指针初始化为有问题的结构,因为这并不能解决结构所在的内存位置的问题。

答案 1 :(得分:0)

struct Tmenu menu_test = {
    2,
    {
        "F1",
        2,
        {DATAFILE...},
        {DATAFILE2...}
    },

应该是

struct Tmenu menu_test = {
    2,
    {
        "F1",
        2,
        {
        {DATAFILE...},
        {DATAFILE2...}
        }
    },

因为struct数组会松开单个括号的声明。

答案 2 :(得分:0)

问题是你声明了一个结构的指针,但事实上你需要一个结构数组。大多数时间struct name*struct name[]将是“可互换的”(阅读K& R以查看它们不是同一个东西),但是在静态初始化的情况下,它必须被声明为数组,因此编译器可以预期它具有固定大小,因此它可以确定用于结构的内存量。

我需要改进我的答案,但我的主要观点是我不希望编译int a* = {3,3,4,5};之类的东西。首先,作业的两侧的类型不同。其次,编译器如何知道它是数组的初始化列表而不是结构?第三,它怎么知道它应该期望4个元素而不是5个?