结构中的二维数组

时间:2012-01-06 15:35:56

标签: c

我必须实现生命游戏,它几乎完成,我想要做的最后一件事就是分配我的场动力。我在Windows下工作,没有Valgrind,我不知道我的代码中的错误是什么。 Eclipse仅显示该进程不再起作用。

有谁能告诉我,我的代码中有什么问题?或者也许我不需要2昏暗。生命游戏阵列?

struct game_field  {
    int length;
    int **field;
};


static struct game_field *new_game_field(unsigned int l) {
    struct game_field *pstField;
    pstField = calloc(1, sizeof(struct game_field));
    pstField->length = l;
    pstField->field = malloc(l * sizeof(int*));
    for( int i = 0; i < l; i++ ) {
        pstField->field[i] = malloc(l * sizeof(int));
        if(NULL == pstField->field[i]) {
             printf("No memory for line %d\n",i);
        }
    }
    return pstField;
}

3 个答案:

答案 0 :(得分:2)

您应该考虑一下结构和存储的内容。

对于生命游戏,你需要知道棋盘上的单元格状态和整数,所以你的结构应该变成:

struct game_field  {
   int length;
   int *field;
};

一旦你知道了字段的尺寸,就应该分配一次:

struct game_field *gf = calloc(1, sizeof(struct game_field));
gf->length = <blah>;
gf->field = malloc(gf->length*gf->length*sizeof(int));

这样你就可以使用一组整数作为你的板。

答案 1 :(得分:1)

第一个malloc应为:

pstField->field = malloc(l * sizeof(int*));

您的数组为int**,因此第一级分配为int*

编辑:嗯,我已经测试了你的代码,它并没有让我崩溃。问题可能出在其他地方。

答案 2 :(得分:0)

以下是对代码的修改,该代码在一个块中分配字段,但仍允许您对两个维使用数组括号:

struct game_field {
  int   length;
  int **field;
};

static struct game_field *new_game_field(unsigned int len)
{
  struct game_field *pstField;
  pstField = malloc(sizeof(struct game_field));
  pstField->length = len;

  /* allocate enough space for all the row pointers + the row contents */
  pstField->field = malloc((len * sizeof(int *)) + (len * len * sizeof(int)));

  /* point the row pointers (at the start of the block) at the row contents
   * (further into the block). */
  for (int i = 0; i < len; i++)
    pstField->field[i] = (int *)(&field[len]) + (i * len);

  return pstField;
}

这样你可以一次性释放场地:

void free_game_field(struct game_field *gf)
{
  free(gf->field);
  free(gf);
}

您可以使用括号表示法访问元素:

int row7col3 = gf->field[7][3];

请注意,您所拥有的(此处以及原始代码中)并不是一个二维数组,而是一个指向整数数组的指针数组 (有区别,但arr[x][y]符号可以适用于任何一种)。