在C中定义二维char数组

时间:2016-10-25 23:21:02

标签: c arrays struct char 2d

就对象和数组而言,我一直在努力从Java切换到C.为了解释我的问题,我的任务是创建一个康威的生活模拟器。我的问题是,当我尝试创建一个对象生成时,它包含当前的板作为二维char数组,并且代数如下:

struct GENERATION
{
    char board[][];
    int numGen;
};

typedef struct GENERATION Generation;

我从编译器收到错误:

Conway's Game of Life.c:6:15: error: array has incomplete element type 'char []'

所以我的问题是:如何在结构中创建未初始化的2D字符数组并能够更改该对象的内容?

1 个答案:

答案 0 :(得分:0)

C中的数组必须将其大小指定为声明的一部分。您必须在GENERATION类型中使用固定大小的数组,如:

#define ROWS 20
#define COLS 30

struct GENERATION
{
  char board[ROWS][COLS];
  int numGen;
};

或者您必须在运行时动态分配board成员。

最直接的方法是分配char的一维数组,其大小足以容纳rowscols元素:

struct GENERATION
{
  char *board;
  int numGen;
};

size_t rows = ...;
size_t cols = ...;

GENERATION g;
g.board = malloc( sizeof *g.board * rows * cols );

然后您将board索引为

g.board[i * rows + j] = ' ';

您需要确保在board超出范围之前释放g成员(或者如果您动态分配它,则取消分配),否则您将发生内存泄漏:< / p>

free( g.board );

如果你的数组的行不必是连续的,你可以做一个零碎的分配,如果你把灯转了一下就会看起来像2D数组:

struct GENERATION
{
  char **board;
  int numGen;
};

GENERATION g;
g.board = malloc( sizeof *g.board * rows );
if ( g.board )
{
  for ( size_t i = 0; i < rows; i++ )
    g.board[i] = malloc( sizeof *g.board[i] * cols );
}

你将其编入索引为

g.board[i][j] = ' ';

同样,您需要在board超出范围之前解除分配g

for ( size_t i = 0; i < rows; i++ )
  free( g.board[i] );
free( g.board );

不幸的是,您不能将变长数组(VLA)用作struct成员;否则这会容易得多。