gpt4 book ai didi

c - 在 C 中定义二维 char 数组

转载 作者:行者123 更新时间:2023-11-30 20:35:10 25 4
gpt4 key购买 nike

就对象和数组而言,我一直在努力从 Java 切换到 C。为了掩饰我的问题,我的任务是创建一个康威的生活模拟器。我的问题是,当我尝试创建一个对象 Generation 时,该对象包含当前棋盘作为二维字符数组和世代编号,如下所示:

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 []'

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

最佳答案

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

#define ROWS 20
#define COLS 30

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

否则您必须在运行时动态分配board成员。

最直接的方法是分配一个由char组成的一维数组,该数组足够大以容纳元素:

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] = ' ';

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

free( g.board );

如果数组的行不必是连续的,则可以进行零碎的分配,如果将灯光调暗一点,则看起来有点像二维数组:

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] = ' ';

同样,您需要在 g 超出范围之前取消分配 board:

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

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

关于c - 在 C 中定义二维 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40251269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com