我必须实现生命游戏,它几乎完成,我想要做的最后一件事就是分配我的场动力。我在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;
}
答案 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]
符号可以适用于任何一种)。