就对象和数组而言,我一直在努力从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字符数组并能够更改该对象的内容?
答案 0 :(得分:0)
C中的数组必须将其大小指定为声明的一部分。您必须在GENERATION
类型中使用固定大小的数组,如:
#define ROWS 20
#define COLS 30
struct GENERATION
{
char board[ROWS][COLS];
int numGen;
};
或者您必须在运行时动态分配board
成员。
最直接的方法是分配char
的一维数组,其大小足以容纳rows
个cols
元素:
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
成员;否则这会容易得多。