C语言中的结构体数组

4

我真的无法理解在C语言中创建结构体数组的正确语法。我尝试了以下方法:

struct foo {
    int x;
    int y;
} foo[][] = {

    {
        { 1, 2 },
        { 4, 5 },
        { -1, -1 }
    },

    {
        { 55, 44 }
        { 100, 200 },
    }
};

例如,foo[1][0].x == 100,foo[0][1].y == 5等等。但是GCC会输出很多错误。
如果有人能提供正确的语法,那就太好了。
编辑:好吧,我尝试了这个:
struct foo {
     const char *x;
     int y;
};

struct foo bar[2][] = {

     {
      { "A", 1 },
      { "B", 2 },
      { NULL, -1 },
     },

     {
      { "AA", 11 },
      { "BB", 22 },
      { NULL, -1 },
     },

     {
      { "ZZ", 11 },
      { "YY", 22 },
      { NULL, -1 },
     },

     {
      { "XX", 11 },
      { "UU", 22 },
      { NULL, -1 },
     },
};

但GCC给我报错:"bar数组的元素类型不完整"和"数组初始化器中有多余的元素"。

如果你的编译器出现错误,如果你发布你所得到的确切错误信息,你将会得到更好的答案。 - bta
在最后一个元素后面不应该有逗号。在你声明foo bar时,你多了5个逗号。 - progrmr
1
@kk6yb:在C语言中允许在最后一个元素之后加逗号,因为这样做可以帮助自动生成代码的程序。当我们删除结构体、联合体、枚举或数组中的最后一个元素时,这也有助于我们。 - nategoose
3个回答

7
这将创建并初始化一个二维结构体数组,每行都包含三个。请注意,您没有为array[1][2]提供初始化器,在这种情况下意味着它的内容未定义。
struct foo {
    const char *x;
    int y;
};

int main()
{
    struct foo array[][3] = {
        {
            { "foo", 2 },
            { "bar", 5 },
            { "baz", -1 },
        },
        {
            { "moo", 44 },
            { "goo", 200 },
        }
    };
    return 0;
}

编辑:将x指向const字符串。 尽量使您的示例接近实际代码。


谢谢。但是我仍然无法让它在我的端上工作(将 int x 替换为 const char *x,并相应地更改初始化,从 int(例如上面的 55)更改为 "foo" ... GCC 输出了大量的“数组初始化器中存在过多的元素”错误)。 - 00010000
{100, 200} 后面有一个多余的逗号。 - progrmr
1
看看马修的 struct foo array[][3] 和你的 struct foo bar[2][]。 修正这个问题,你编辑过后的问题就能够正常工作了。 - mbauman
@kk6yb:那应该没问题。尾随逗号是一种被广泛接受的扩展,已成为C99中的规范。 - mbauman
这实际上不是最大值,而是行的确切宽度。正如我所说,初始化程序太短,额外位置的内容将未定义(对于堆栈变量)。 - Matthew Flaschen
显示剩余2条评论

2

我认为最简单的方法是将结构体和数组声明拆分:

struct foo {
    int x;
    int y;
};

int main()
{
    struct foo foo_inst = {1, 2};
    struct foo foo_array[] = {
        {5, 6},
        {7, 11}
    };
    struct foo foo_matrix[][3] = {
        {{5,6}, {7,11}},
        {{1,2}, {3,4}, {5,6}}
    };

    return 0;
}

问题在于,在C(和C ++)中,除了最外层以外的任何数组都不能具有任意长度的嵌套数组声明。换句话说,您不能说 int[][] arr,而必须说int[][5] arr。同样,您不能说int[][6][] arrint [][][7] arr,您必须说 int[][6][7] arr


0
你的第一个问题是数组的声明。 只有第一个方括号可以留空,其余必须明确声明。
所以,不要这样做:
struct foo bar[2][]

你应该这样做:

struct foo bar[][4]

这真的是需要首先解决的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接