C语言 改变固定的二维数组的大小在运行时给定



我一整天都在想这件事…

到目前为止,我所拥有的代码按计划工作,我的想法是,我必须改变tCell * cells[3][5];取运行时给定的大小。我需要做什么更改来保留功能?

typedef struct {
  int active;
} tCell;
typedef struct {
  tCell * cells[3][5];
} tGrid;
// creates a grid and initialize all the cells to NULL
tGrid *init_grid()
{
  tGrid *grid= malloc(sizeof(tGrid));
  if(grid == NULL)
      exit(127); // failed to malloc
  int i, j;
  for(i=0; i < 3; i++)
    for(j=0; j < 5; j++)
      grid->cells[i][j]= NULL;
  return grid;
}
// adds a cell to the grid
void add_cell(tGrid *grid)
{
    tCell cell;
    int y = rand() % 4;
    if(grid->cells[0][y] != NULL)
        exit(127); // cell is taken
    cell.active = 1;
    grid->cells[0][y] = &cell;
}
void remove_cell(tGrid *grid, int x, int y)
{
    if(x < 0 || x > 3 || y < 0 || y > 5)
        exit(127); // out of bounds
    grid->cells[x][y]= NULL;
}

基本上,init_grid必须以xy为参数:

tGrid *init_grid(int x, int y);

但是,我如何改变tGrid结构的定义?无论我已经尝试到目前为止产生了编译器错误(例如tCell * cells[][];)

在一个稍微相关的笔记上,你如何读出"tCell * cells[3][5];"?

注意:

  • 这是一个C问题
  • 我正在使用gcc 4.1来编译代码

轻松。

typedef struct {
  int rows;
  int columns;
  tCell **cells;
} tGrid;
分配:

tGrid *pGrid = (pGrid*)malloc(sizeof(tGrid));
/* check results etc */
pGrid->rows = rows;
pGrid->columns = columns;
pGrid->cells = (tCell**)malloc(sizeof(tCell*)*rows);
/* check results */
do{
    pGrid->cells[rows-1] = (tCell*)malloc(sizeof(tCell)*columns);
    /* check results */
} while (--rows);

或者,你也可以这样做:

typedef struct {
  int rows;
  int columns;
  tCell *cells;
} tGrid;
/*****whatever in the middle ***********/
pGrid->cells = (tCell*)malloc(sizeof(tCell)*rows*columns);

代替do-while循环。不同之处在于,在第一种情况下,每一行将是内存中的一个单独数组,这在处理事情时可能很有用。

当然,最后,每个malloc都必须有一个free

相关内容

  • 没有找到相关文章

最新更新