【问题标题】:Defining a 2 dimensional char array in C在 C 中定义二维字符数组
【发布时间】:2016-10-25 23:21:01
【问题描述】:

就对象和数组而言,我一直在努力从 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 []'

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

【问题讨论】:

  • 数组必须有静态边界。换句话说,您需要指定数组的大小。如果这些在编译时未知,则需要将内存动态分配到char**。你所拥有的不是 C 中的有效构造。
  • 你应该参考一本 C 的书来学习这门语言。通过反复试验来学习 C 绝对是一件非常糟糕的事情。首先:C“对象”与典型的 OOPL 所称的“对象”非常不同。
  • @DeiDei:char ** 不能容纳二维数组!不要留下错误的痕迹。唯一正确的是 OP 需要一个指针。但是对于char (*)[COLS],而不是char **
  • 将数字放入[]

标签: c arrays struct char 2d


【解决方案1】:

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

您需要确保在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 成员;否则这会容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2014-12-21
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多