在结构体初始化中如何初始化一个嵌套结构体?

4
这可能听起来有点愚蠢,但我必须知道,因为我正在用C语言编写一个bingo游戏板。
#include <stdio.h>
typedef struct {
    int a;
    int b;
    int c;
    int d;
    int e;
} row;

typedef struct {
    row one;
    row two;
    row three;
    row four;
    row five;   
} bingo_board;

void initialize_columns()
{
    bingo_board board = {
    .one = {1, 2, 3, 4, 5},
    .two = {6, 7, 8, 9, 10},
    .three = {11, 12, 13, 14, 15},
    .four = {16, 17, 18, 19, 20},
    .five = {21, 22, 23, 24, 25}
    };
}

这个是否可能?


5
typedef struct { int cells[5][5]; } bingo_board; 是一种更加适合循环操作的数据结构。 - James McNellis
我对C语言还不是很熟悉。我知道这是一个数组,但您能否再明确一些?谢谢。 - zeboidlund
1
这是一个由整数组成的二维数组(五行五列)。名为 xbingo_board 可以通过 x.cells[row][column] 访问。这比为每一行或每一列编写单独的情况要容易得多。使用您的实现,您必须为 x.one.ax.four.a 编写单独的代码(您至少必须编写十个情况,每行和每列一个)。 - James McNellis
2个回答

4

这可以很简单地完成

void initialize_columns()
{
    bingo_board board = {
      {1, 2, 3, 4, 5},
      {6, 7, 8, 9, 10},
      {11, 12, 13, 14, 15},
      {16, 17, 18, 19, 20},
      {21, 22, 23, 24, 25}
    };
}

甚至作为

的形式

void initialize_columns()
{
    bingo_board board = {
      1, 2, 3, 4, 5,
      6, 7, 8, 9, 10,
      11, 12, 13, 14, 15,
      16, 17, 18, 19, 20,
      21, 22, 23, 24, 25
    };
}

不必给每行打“标记”。标记语法在C99中可用,而您示例中的内容已经符合C99的要求。


1
由于结构体在 c 语言中是一等公民,所以赋值是良好定义的,这让您能够...
static bingo_board initial_board = {
    {1, 2, 3, 4, 5},
    {6, 7, 8, 9, 10},
    {11, 12, 13, 14, 15},
    {16, 17, 18, 19, 20},
    {21, 22, 23, 24, 25}
};


void init_board(bingo_board *b)
{
    *b = initial_board;
}

这似乎是您想要的。如果您在函数内声明板,请建议将其声明为静态,因为您不会修改它,所以持续更改是可以的,并且该功能不必在每次调用时增加堆栈。


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